目前有两个主要的Java Object to Object映射框架取代了Dozer(http://dozer.sourceforge.net/documentation/mappings.html),它们是:
除了这个页面(http://vytas.io/blog/java/java-object-to-object-mapping-which-framework-to-choose-part-2/)我还没找到关于哪个框架比另一个更好,或者在什么情况下它们更好的在线.想知道是否有人可以对此有所了解.在基于文档的功能方面,它们似乎在做同样的事情.
正在使用的技术堆栈:
Java 8 MapStruct:1.2.0.Final Lombok:1.16.18 IDE:IntelliJ - 已经安装了Lombok插件
@Getter和@Setter注释时,我遇到了问题,mapstruct无法找到属性并说:Unknown property "id" in result type com.vg.once.dto.OneDto. Did you mean "null"?以下是项目文件:
实体对象:One.java:
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class One {
private int id;
private Integer version;
private int projectId;
private String title;
private String code;
private int sortOrder;
}
Run Code Online (Sandbox Code Playgroud)
DTO对象:OneDTO.java:
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class OneDto {
private int id;
private …Run Code Online (Sandbox Code Playgroud) intellij-idea lombok java-8 mapstruct intellij-lombok-plugin
升级到 Idea 2020.3 版本后,我得到了映射处理器的 NullPointerException。如果有人有线索...谢谢!
我正在MVC REST用Spring Boot和编写一个应用程序Hibernate。我决定DTO使用MAPSTRUCT. 看来我按照指南做了一切,但出现了错误。有什么问题,我无法理解。论坛和google上的信息很少。
PS 起初我以为问题出在Lombok,所以我删除Lombok并手动分配getters / setters。然后问题并没有解决。我在Drink课堂上和DrinkDTO我规定的课程中都参加了getters / setters。但这仍然没有帮助。
喝:
@Entity
@Table(name = "drink", schema = "public")
public class Drink {
public Drink() { // Constructor for Hibernate
}
// Fields
//
private @Id
@GeneratedValue
Long id;
@Column(name = "name")
private String name;
@Column(name = "price")
private float price;
@Column(name = "about")
private String about;
@Column(name = …Run Code Online (Sandbox Code Playgroud) 我在我的代码中使用MapStruct与不同业务用例之间共享的大型模型(超过50个字段).根据入口点,将映射一些属性,而不映射一些属性.当我构建项目时,我将始终获得"警告:未映射的目标属性"消息.
我已经研究过并且可以通过使用语义来告诉mapstruct忽略该字段
@Mapping(target = "propName", ignore = true)
Run Code Online (Sandbox Code Playgroud)
问题是,鉴于我的对象具有如此多的字段,将需要大量代码来忽略每个映射器类中的每个单独属性.我也不希望在我的日志中出现此警告.有没有办法告诉mapstruct忽略未映射的内容,避免这条消息?
我正在尝试使用 mapstruct 1.2.0.CR2 映射嵌套属性。(示例将customer.address.houseNumber映射到 userDTO.homeDTO.addressDTO.houseNo)。
期望:当 customer.address 为 null 时,我不想将 addressDTO 设置为 null。由于 addressDTO 包含“countyname”和其他已从其他不同源设置的属性。
请告知我是否可以设置某些属性/设置,以便当源为空时目标不会设置为空。
@Mapper( nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS )
public interface CustomerUserMapperNullCheck {
@Mapping(source="address", target="homeDTO.addressDTO" )
void mapCustomer(Customer customer, @MappingTarget UserDTO userDTO) ;
@Mapping(source="houseNumber", target="houseNo" )
void mapCustomerHouse(Address address, @MappingTarget AddressDTO addrDTO) ;
}
Run Code Online (Sandbox Code Playgroud)
我最初尝试像下面这样的单一映射
@Mapping(target="homeDTO.addressDTO.houseNo", source="address.houseNumber")
abstract void mapCustomerHouse(Customer customer, @MappingTarget UserDTO userDTO) ;
Run Code Online (Sandbox Code Playgroud)
然后尝试基于https://github.com/mapstruct/mapstruct/issues/649拆分映射。
两种方法都不会产生预期的结果/生成的方法代码
protected void customerToHomeDTO(Customer customer, HomeDTO mappingTarget) {
if ( customer == null ) {
return;
} …Run Code Online (Sandbox Code Playgroud) 要使用mapstruct映射某个对象,我需要一些自定义后期处理,这需要一个额外的参数来完成它的工作:
@Mapper
public abstract class AlertConfigActionMapper {
@Mappings({ @Mapping(target = "label", ignore = true)})
public abstract AlertConfigActionTO map (AlertConfigAction action, Locale userLanguage);
@AfterMapping
public void setLabel (AlertConfigAction action, @MappingTarget AlertConfigActionTO to, Locale userLanguage) {
for (AlertConfigActionLabel label : action.getAlertConfigActionLabels()) {
if (label.getLanguage().equals(userLanguage)) {
to.setLabel(label.getLabel());
break;
} else if (label.getLanguage().equals(Locale.ENGLISH)) {
to.setLabel(label.getLabel());
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这很好用.当我向此映射器添加以下方法时,问题开始:
public abstract ArrayList<AlertConfigActionTO> mapList (List<AlertConfigAction> actions, Locale userLanguage);
Run Code Online (Sandbox Code Playgroud)
我需要传递这个参数(userLanguage),但是在这种情况下mapstruct似乎"分解":我为这部分生成以下代码(这自然会产生编译错误):
@Override
public List<AlertConfigActionTO> mapList(List<AlertConfigAction> actions, Locale userLanguage) {
if ( actions == null && userLanguage …Run Code Online (Sandbox Code Playgroud) 我需要在生成的mapper实现中注入一个spring服务类,以便我可以通过它来使用它
@Mapping(target="x", expression="java(myservice.findById(id))")"
Run Code Online (Sandbox Code Playgroud)
这适用于Mapstruct-1.0吗?
我将 Mapstruct 和 Lombok 与 maven 和 IDEA 一起使用,但它拒绝生成映射器实现。配置:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
...
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<java.version>11</java.version>
<org.mapstruct.version>1.3.0.Beta2</org.mapstruct.version>
<lombok.version>1.18.2</lombok.version>
</properties>
<dependencies>
<!-- spring deps -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
...
<!-- lombok dep -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
</dependencies>
<build> …Run Code Online (Sandbox Code Playgroud) 在 @Mapper 中使用多个参数时,@Context 参数似乎无法访问
public interface MyMapper {
@Mapping(target="target1", source="arg1.arg") //works
@Mapping(target="target2", source="arg2") //works
@Mapping(target="target3", source="arg2.arg") //works
@Mapping(target="target2", source="context.arg") //NOT WORKING
public MyTarget convert(Object arg1, Object arg2, @Context Object context);
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用并expression=""解决它,但我无法让它工作。
有什么建议么?
我看得出来我不是唯一一个有此愿望的人。 https://github.com/mapstruct/mapstruct/issues/1280
谢谢