MapStruct按原样映射嵌套bean

时间:2017-04-16 14:56:09

标签: java spring spring-boot jhipster mapstruct

我的问题是如何将对象包含嵌套对象映射到DTO,而不是来自嵌套对象的值,例如,如果有2个这样的类:

    public class TestClass {
        @Id
        private String id;

        @Field("field1")
        private String field1;

        @Field("field2")
        private Long field2;

        @Field("nestedClass")
        private NestedClass;

        //getter & setter 
    }

    public class NestedClass {
    //fields and getter and setter for it
    }

    DTO classes looks like :

    public class TestClassDTO {
        private String id;
        private String field1;
        private Long field2;
        private NestedClassDTO ;

        //getter & setter 
    }

    public class NestedClassDTO {
        //fields and getter and setter for it
    }


    @Mapper(componentModel = "spring", uses = {})
    public interface TestClassMapper {

        TestClassDTO TestClassToTestClassDTO(TestClass TestClass);

        TestClass TestClassDTOToTestClass(TestClassDTO TestClassDTO);

        NestedClass NestedClassDTOToNestedClass(NestedClassDTO NestedClassDTO);

        NestedClassDTO NestedClassToNestedClassDTO(NestedClass NestedClass);

        }

在调用TestClassDTOToTestClass()并发送TestClassDTO包含NestedClassDTO ..它返回TestClass并使用null NestedClass ..是否可以映射它而无需编写我自己的映射器?

SH

3 个答案:

答案 0 :(得分:1)

我找到了它:)

映射器类应该使用如下的嵌套类:

    @Mapper(componentModel = "spring", uses = {NestedClassMapper.class})
    public interface TestClassMapper {

        TestClassDTO TestClassToTestClassDTO(TestClass TestClass);

        TestClass TestClassDTOToTestClass(TestClassDTO TestClassDTO);

        NestedClass NestedClassDTOToNestedClass(NestedClassDTO NestedClassDTO);

        NestedClassDTO NestedClassToNestedClassDTO(NestedClass NestedClass);

    }

答案 1 :(得分:0)

不是这样的: 生成getter和setter时TestClassDTO获取NestedClassDTO

或者如果你需要一个包装类更好看一下:( GENERICS ) 这是实现 Wrapper DTO

的最佳和最商业化的设计
public class Value <T>
 {
     private T innerValue ;

     public Value ( T _value )
     {
         innerValue = _value ;
     }

     public T read ()
     {
         return innerValue ;
     }
 }

答案 2 :(得分:0)

如果我理解正确,您希望有一种映射方法不会映射(忽略)Server=localhost;Port=3306;Database=testing;Uid='test';Pwd='‌​test';AllowUserVaria‌​bles=True; 中的nestedClass字段。您可以使用@Mapping#ignore

您的映射器看起来像:

TestClassDTO

如果出于某种原因,您希望将值明确设置为@Mapper(componentModel = "spring", uses = {}) public interface TestClassMapper { TestClassDTO TestClassToTestClassDTO(TestClass TestClass); @Mapping(target = "nestedClass", ignore = true) TestClass TestClassDTOToTestClass(TestClassDTO TestClassDTO); NestedClass NestedClassDTOToNestedClass(NestedClassDTO NestedClassDTO); NestedClassDTO NestedClassToNestedClassDTO(NestedClass NestedClass); } ,那么请查看this question的答案