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

@服务类未在组织中自动连接。mapstruct@映射器类

赵俊侠
2023-03-14

我正在尝试使用MapSTRt将json序列化添加到我的SpringBoot应用程序中。@Mapper类使用@Service添加一些“后映射”逻辑。问题是,这个@Service类不是自动装配的。

这是我的Mapper类:

@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE, componentModel = "spring")
public abstract class InstrumentMapper {

    protected MarketDataService marketDataService; // is @Service

    @Mapping(target = "marketCode",
            expression = "java(instrument.getMarket().getCode())")
    public abstract InstrumentDto fromInstrument(Instrument instrument);

    public abstract List<InstrumentDto> fromInstruments(List<Instrument> instruments);

    @Mapping(target = "market",
            expression = "java(marketDataService.findMarketByCode(instrumentDto.getMarketCode()))")
    public abstract Instrument toInstrument(InstrumentDto instrumentDto);

    public abstract List<Instrument> toInstruments(List<InstrumentDto> instrumentDtos);

    @Autowired
    public void setMarketDataService(MarketDataService marketDataService) {
        this.marketDataService = marketDataService;
    }
}

当调用toInstrument方法时,应用程序将与NPE一起失败,尝试marketDataService。findMarketByCode(instrumentDto.getMarketCode())

希望这些信息足够了。如果还需要什么,请告诉我。

提前谢谢!

更新:

MarketDataService类。它通过@Service注释添加到上下文中。

@Service
public class MarketDataService {

    @Autowired
    private InstrumentRepository instrumentRepository;

    public Instrument findInstrumentByCode(String code) {
        return instrumentRepository.findFirstByCode(code);
    }

    public List<InstrumentDto> getAllInstrumentDtos() {
        List<Instrument> instruments = getAllInstruments();
        List<InstrumentDto> dtos = Mappers.getMapper(InstrumentMapper.class).fromInstruments(instruments);
        return dtos;
    }

    public void updateInstrument(InstrumentDto instrumentDto) {
        Instrument instrument = findInstrumentByCode(instrumentDto.getCode());
        if (instrument == null) {
            throw new IllegalArgumentException("Market with given code not found!");
        }
        instrumentRepository.delete(instrument);
        instrument = Mappers.getMapper(InstrumentMapper.class).toInstrument(instrumentDto);
        instrumentRepository.save(instrument);
    }
}

算法如下:@Controller类获取PUT请求并使用请求的主体(InstrentDto参数)调用MarketDataService.updateInstruments方法。后者调用具有相同参数的仪器方法。

共有1个答案

卢英范
2023-03-14

拥有NPE的原因是,对于非默认组件模型,使用MapStructMappersfactory。

映射器工厂不执行任何依赖项注入。

您必须将映射器注入MarketDataService中。这样做时要小心,因为您有一个循环依赖项。

除此之外,您在Mapper中使用的模式实际上并不正确。当一个简单的源代码就可以了时,您正在使用一个表达式。

e、 g。

@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE, componentModel = "spring")
public abstract class InstrumentMapper {

    protected InstrumentRepository instrumentRepository;

    @Mapping(target = "marketCode", source = "market.code")
    public abstract InstrumentDto fromInstrument(Instrument instrument);

    public abstract List<InstrumentDto> fromInstruments(List<Instrument> instruments);

    @Mapping(target = "market", source = "marketCode")
    public abstract Instrument toInstrument(InstrumentDto instrumentDto);

    public abstract List<Instrument> toInstruments(List<InstrumentDto> instrumentDtos);

    protected Instrument findInstrumentByCode(String code) {
        return instrumentRepository.findFirstByCode(code);
    }

    @Autowired
    public void setMarketDataService(MarketDataService marketDataService) {
        this.marketDataService = marketDataService;
    }
}
 类似资料:
  • 我有麻烦映射一个嵌套dto字段正确与MapStruct。我有几个DTO: 具有相应的映射器 到目前为止,一切工作都很好,生成的代码自动连接其他需要的映射器来正确地构建DTO。例如生成的仪器映射器实现 现在,当我试图创建一个包含嵌套工具dto的映射器时遇到了麻烦。映射器应使用instrumentMapper正确创建所需的dto。DTO: 映射器: 生成的代码: 现在media mapper得到了很好

  • 我正在使用Mapstruct(使用lombok),当我在调用使用Mapstruct将DTO映射到实体的endpoint后对应用程序进行dockerize时,Mapstruct失败。 引起:java.lang.ClassNotFoundException:org.mapstruct.factory.映射器在java.base/java.net.URLClassLoader.findClass(URL

  • 我可以想象这样一个解决方案:一个子映射器,在这个映射器中,我用如下所示的查找重写Dto to Domain方法: 但目标在MapStruct中是必需的。也许我可以以某种方式指定整个对象作为目标?

  • 我正在使用MapStruct和在我的代码中的不同业务用例之间共享的大模型(超过50个字段)。根据入口点的不同,有些属性将被映射,有些则不被映射。当我构建我的项目时,我总是会得到“警告:未映射的目标属性”消息。 我已经研究过,并且看到可以通过使用语义命令来告诉mapstruct忽略该字段 问题是,给定我的对象具有如此多的字段,忽略每个映射器类中的每个属性将需要大量的代码。我也不想在我的日志上出现这个

  • null 这是我运行单元测试时得到的跟踪: 我认为在我的pom.xml文件的build/plugin部分缺少或放错了地方 可以在这里查看项目的源代码: https://github.com/alfredux79/mapstruct-lombock-springboot/tree/stack-overflow-question