标签: mapstruct

Java映射:Selma与MapStruct

目前有两个主要的Java Object to Object映射框架取代了Dozer(http://dozer.sourceforge.net/documentation/mappings.html),它们是:

  1. 塞尔玛 - http://www.selma-java.org/
  2. MapStruct - http://mapstruct.org/

除了这个页面(http://vytas.io/blog/java/java-object-to-object-mapping-which-framework-to-choose-part-2/)我还没找到关于哪个框架比另一个更好,或者在什么情况下它们更好的在线.想知道是否有人可以对此有所了解.在基于文档的功能方面,它们似乎在做同样的事情.

java mapping mapstruct

56
推荐指数
2
解决办法
2万
查看次数

MapStruct和Lombok无法收集

正在使用的技术堆栈:

Java 8 MapStruct:1.2.0.Final Lombok:1.16.18 IDE:IntelliJ - 已经安装了Lombok插件

  • 最初,当我删除getter和setter以及添加@Getter@Setter注释时,我遇到了问题,mapstruct无法找到属性并说:Unknown property "id" in result type com.vg.once.dto.OneDto. Did you mean "null"?
  • 我开始知道Lombok 1.16.14或更新版本与MapStruct 1.2.0.Beta1或更新版本是兼容的并且可以一起工作,但我的版本更新,然后仍然需要问题.
  • 我已经尝试过的另一个解决方案是运行Lombok的Delombok插件,但仍然会出现同样的问题.

以下是项目文件:

实体对象: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

38
推荐指数
7
解决办法
1万
查看次数

IntelliJ Idea mapstruct java:映射处理器中的内部错误:java.lang.NullPointerException

升级到 Idea 2020.3 版本后,我得到了映射处理器的 NullPointerException。如果有人有线索...谢谢!

intellij-idea mapstruct

36
推荐指数
4
解决办法
3万
查看次数

@MAPSTRUCT。源参数中不存在名为“packaging”的属性

我正在MVC RESTSpring 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)

java class dto spring-boot mapstruct

30
推荐指数
3
解决办法
4万
查看次数

MapStruct自动忽略未映射的属性

我在我的代码中使用MapStruct与不同业务用例之间共享的大型模型(超过50个字段).根据入口点,将映射一些属性,而不映射一些属性.当我构建项目时,我将始终获得"警告:未映射的目标属性"消息.

我已经研究过并且可以通过使用语义来告诉mapstruct忽略该字段

@Mapping(target = "propName", ignore = true)
Run Code Online (Sandbox Code Playgroud)

问题是,鉴于我的对象具有如此多的字段,将需要大量代码来忽略每个映射器类中的每个单独属性.我也不希望在我的日志中出现此警告.有没有办法告诉mapstruct忽略未映射的内容,避免这条消息?

java mapstruct

26
推荐指数
2
解决办法
2万
查看次数

映射结构:当源为空时,目标不应设置为空

我正在尝试使用 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)

java null target mapstruct

20
推荐指数
1
解决办法
5万
查看次数

使用mapstruct映射带参数的集合

要使用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)

java mapstruct

16
推荐指数
2
解决办法
2417
查看次数

Mapstruct - 如何在Generated Mapper类中注入spring依赖项

我需要在生成的mapper实现中注入一个spring服务类,以便我可以通过它来使用它

   @Mapping(target="x", expression="java(myservice.findById(id))")"
Run Code Online (Sandbox Code Playgroud)

这适用于Mapstruct-1.0吗?

spring mapstruct

16
推荐指数
5
解决办法
2万
查看次数

MapStruct 不生成实现类

我将 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)

java spring-boot mapstruct

16
推荐指数
3
解决办法
3万
查看次数

Mapstruct :在 @Mapping 的源参数中使用上下文

在 @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

谢谢

mapstruct

15
推荐指数
3
解决办法
3万
查看次数