当前位置: 首页 > 知识库问答 >
问题:

映射器未正确映射-mapstruct

凤柏
2023-03-14

我有麻烦映射一个嵌套dto字段正确与MapStruct。我有几个DTO:

@Data
public class InstrumentGet {

    .....
    private MediaGet image;
    private List<LocaleGet> locales;

}
@Data
public class LocaleGet {

    private String name;
    private String description;
    private String iso6391;
    private boolean defaultLanguage;

}
@Data
public class MediaGet {
    private String uri;
    private int width;
    private int height;
}

具有相应的映射器

@Mapper(componentModel = "spring")
public interface LocaleMapper {
    @Mapping(source = "culture.iso6391",target = "iso6391")
    @Mapping(source = "culture.defaultLanguage",target = "defaultLanguage")
    LocaleGet toDtoGet(BaseLocale locale);
    List<LocaleGet> toDtosGet(List<BaseLocale> locales);
}
@Mapper( componentModel = "spring")
public interface MediaMapper {

    MediaGet toDtoGet(Media media);
}
@Mapper(componentModel = "spring",uses = {MediaMapper.class, LocaleMapper.class})
public interface InstrumentMapper {
    InstrumentGet instrumentToInstrumentGet(Instrument instrument, List<BaseLocale> locales);


}

到目前为止,一切工作都很好,生成的代码自动连接其他需要的映射器来正确地构建DTO。例如生成的仪器映射器实现

@Component
public class InstrumentMapperImpl implements InstrumentMapper {

    @Autowired
    private MediaMapper mediaMapper;
    @Autowired
    private LocaleMapper localeMapper;

    @Override
    public InstrumentGet instrumentToInstrumentGet(Instrument instrument, List<BaseLocale> locales) {
        if ( instrument == null && locales == null ) {
            return null;
        }

        InstrumentGet instrumentGet = new InstrumentGet();

        if ( instrument != null ) {
            instrumentGet.setDefaultName( instrument.getDefaultName() );
            instrumentGet.setImage( mediaMapper.toDtoGet( instrument.getImage() ) );
        }
        if ( locales != null ) {
            instrumentGet.setLocales( localeMapper.toDtosGet( locales ) );
        }

        return instrumentGet;
    }
}

现在,当我试图创建一个包含嵌套工具dto的映射器时遇到了麻烦。映射器应使用instrumentMapper正确创建所需的dto。DTO:

@Data
    public class MemberGet {
        ......
        private MediaGet image;
        private InstrumentGet instrument;
        ......
    }

映射器:

@Mapper(componentModel = "spring",uses = {InstrumentMapper.class, MediaMapper.class})
public interface ClientMapper {

@Mapping(source = "member.band.uid",target = "bandUid")
MemberGet toDtoMemberGet(Member member,  List<BaseLocale> locales);

}

生成的代码

@Component
public class ClientMapperImpl implements ClientMapper {

    @Autowired
    private MediaMapper mediaMapper;

    @Override
    public MemberGet toDtoMemberGet(Member member, List<BaseLocale> locales) {
        if ( member == null && locales == null ) {
            return null;
        }

        MemberGet memberGet = new MemberGet();

        if ( member != null ) {
            memberGet.setBandUid( memberBandUid( member ) );
            memberGet.setPersonDetails( member.getPersonDetails() );
            memberGet.setBirthday( member.getBirthday() );
            memberGet.setGender( member.getGender() );
            memberGet.setImage( mediaMapper.toDtoGet( member.getImage() ) );
            memberGet.setInstrument( instrumentToInstrumentGet( member.getInstrument() ) );
        }

        return memberGet;
    }

    private String memberBandUid(Member member) {
        if ( member == null ) {
            return null;
        }
        Band band = member.getBand();
        if ( band == null ) {
            return null;
        }
        String uid = band.getUid();
        if ( uid == null ) {
            return null;
        }
        return uid;
    }

    protected InstrumentGet instrumentToInstrumentGet(Instrument instrument) {
        if ( instrument == null ) {
            return null;
        }

        InstrumentGet instrumentGet = new InstrumentGet();

        instrumentGet.setDefaultName( instrument.getDefaultName() );
        instrumentGet.setImage( mediaMapper.toDtoGet( instrument.getImage() ) );

        return instrumentGet;
    }
}

现在media mapper得到了很好的处理,并使用了所需的方法,我遇到了仪器mapper的问题,mapstruct没有自动调用所需的方法,而是创建了自己的方法,这不适合我的需要。我显然在这里做错了什么。谁能给我一个提示或任何一种建议吗?

问候

共有1个答案

阎裕
2023-03-14

当从另一个映射器直接使用具有多个源参数的映射器时,mapstruct中有一个限制。您可以通过移除所引用映射器的两个参数中的一个来自行测试它。

相反,您可以使用@BeforeMapping、@AfterMapping或decoractor来解决您的问题。

Context参数也可以工作。

 类似资料:
  • 前端将这个json发送到我的API 控制器:

  • 当我尝试通过枚举将源中的字符串映射到目标中的整数时。ModelMapper失败。 来源 目的地 字符串和整数之间的映射在枚举中定义

  • 我正在构建一个REST API, 和ActiveBid类 和我的泽西请求映射器,它具有获取数据的逻辑 有人能帮我吗?我不知道和卡桑德拉共事会这么难。

  • 问题内容: 我一直在研究一个非常简单的JPA示例,并试图将其调整为现有数据库。但是我无法克服这个错误。(下面。)这只是我没看到的一些简单的事情。 在下面的DocumentManager类中(一个简单的servlet,因为这是我的目标),它做了两件事: 插入一行 返回所有行 插入效果很好-一切都很好。问题出在检索上。我尝试了各种参数值,但没有走运,并且尝试了各种更复杂的类注释(如列类型),但都没有成

  • 所以,我有一个问题,这里的人可能会帮助我与推土机。 背景:我设置了Dozer来将我的持久性实体映射到它们的DTO类。这很简单,我只是创建一个实体类的精确副本作为POJO,并允许dozer通配符查看字段的名称是否与源字段匹配。我正在使用自定义映射器处理Hibernate延迟加载问题,就像这里所做的那样。我告诉Dozer如何通过一个类来映射每个类,该类扫描实体中名为@EntityMap(DTOxxx.

  • 问题内容: 我正在尝试设置控制器,但是很遗憾无法查看输出…一切都正确呈现。当我转到404页面时。从Netbeans运行我的应用程序转到 app-config.xml web.xml 我如何调试它,看看有什么用,什么没用? 更新资料 Netbeans中的GlassFish服务器日志显示 问题答案: 您的名字映射到中吗?从您先前的问题中,我看到: 网址不匹配格式。尝试一种可能的解决方法。