首页 > 解决方案 > mapstruct 目标对象设置多次而不是更新

问题描述

下面是我的映射器界面。我正在使用mapstruct 1.3.0.Final.

@Mapper(componentModel = "spring")
public interface ApiMapper {
    @Mappings({
        @Mapping(source = "in.entityName.fn", target="name.fn"),
        @Mapping(source = "in.entityName.ln", target="name.ln"),
        @Mapping(source = "in.salute.sln", target="name.salutation"),
    })
    public MyOutput map(InputData in);
}

看起来超级简单,但是实现类把name目标中的对象设置了两次,所以我只得到了最后一个映射的对象。有人可以帮助我了解我在这里遗漏了什么或做错了什么吗?

@Component
public class ApiMapperImpl implements ApiMapper {

    @Override
    public MyOutput map(InputData in) {
        if ( in == null ) {
            return null;
        }

        MyOutput myOutput = new MyOutput();

        myOutput.setName( entityNameToNameDetails( in.getEntityName() ) );
        myOutput.setName( saluteServiceOutputToNameDetails( in.getSalute() ) );

        return myOutput;
    }

    protected NameDetails entityNameToNameDetails(EntityName entityName) {
        if ( entityName == null ) {
            return null;
        }

        NameDetails nameDetails = new NameDetails();

        nameDetails.setFn( entityName.getFn() );
        nameDetails.setLn( entityName.getLn() );

        return nameDetails;
    }

    protected NameDetails saluteServiceOutputToNameDetails(SaluteServiceOutput saluteServiceOutput) {
        if ( saluteServiceOutput == null ) {
            return null;
        }

        NameDetails nameDetails = new NameDetails();

        nameDetails.setSalutation( saluteServiceOutput.getSln() );

        return nameDetails;
    }
}

标签: javamappingmapstruct

解决方案


我认为,您应该在这种情况下帮助 mapstruct,添加一个简单的方法,例如:

@Mappings({
    @Mapping(source = "in.entityName.fn", target="fn"),
    @Mapping(source = "in.entityName.ln", target="ln"),
    @Mapping(source = "in.salute.sln", target="salutation"),
})
public NameDetails mapNameDetails(InputData in);`

推荐阅读