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

如何将Springbean(custructor)注入到Mapstruct的抽象映射器中?

农建弼
2023-03-14

我有下面的映射器类,我想在其中使用CounterService。我正在尝试构造函数注入,但不起作用,并且null正在打印。

@Mapper(componentModel = "spring", uses = CounterService.class, injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public abstract class CarMapper {

    private CounterService counterService;

    public CarMapper(CounterService counterService) {
       this.counterService = counterService;
    }

    public abstract Car dtoToEntity(CarDto carDto);

    public CarDto entityToDto(Car car) {
        System.out.println(counterService)
        //....
        return carDto;
    }

}

mapStruct实现类

@Component
public class CarMapperImpl extends CarMapper{

  @Override
  public Car dtoToEntity(CarDto carDto){
    //...
  }
}

如果我使用@AutoWired使用字段注入,这样它就可以正常工作。这意味着Spring不支持抽象类的构造函数注入。是因为抽象类不能直接实例化,需要子类来实例化吗?
有没有什么方法mapSTRt可以在实现类中创建一个构造函数,如下所示:

  public CarMapperImpl(CounterService counterService){
    super(counterService);
  }

这样,构造函数注入应该可以工作。

共有2个答案

鞠晋
2023-03-14

您还可以使用如下所示的映射器装饰器。此外,始终确保检查生成的类。

@DecoratedWith(CarDecoratorMapper.class)
@Mapper(componentModel = "spring")
public interface CarMapper {

    Car dtoToEntity(CarDto carDto);
    CarDto entityToDto(Car car);

}

public abstract class CarDecoratorMapper implements CarMapper {

    @Autowired
    private CarMapper delegate;

    @Autowired
    private CounterService counterService;    

    public Car dtoToEntity(CarDto carDto) {
        Car car = delegate.dtoToEntity(carDto);
        car.setProperty(counterService.count(carDto));
    
        return car;
    }

    public CarDto entityToDto(Car car) {
        CarDto carDto = delegate.entityToDto(car);
        carDto.setProperty(counterService.countDto(car));

        return carDto;
    }
}
沈高峻
2023-03-14

这与Spring无关。MapStruct团队慎重决定不使用超级构造函数。

不过,您可以使用setter注入。

@Mapper(componentModel = "spring", uses = CounterService.class, injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public abstract class CarMapper {

    private CounterService counterService;

    public abstract Car dtoToEntity(CarDto carDto);

    public CarDto entityToDto(Car car) {
        System.out.println(counterService)
        //....
        return carDto;
    }

    @Autowired
    public void setCounterService(CounterService counterService) {
        this.counterService = counterService;
    }

}
 类似资料:
  • 我正在使用MapStruct,mapstruct-jdk8版本1.1.0.final并定义我通过spring注入的抽象类。 我正在研究如何能够通过Junit测试来测试它们?我有一个基本的主映射器,它将使用2个子映射器 我尝试了几种方法,但无法正确实例化映射器来测试它。 java.lang.RuntimeException:java.lang.ClassNotFoundException:找不到Co

  • 我在为SpringJUnit4ClassRunner.class)配置测试时遇到了问题。我的问题是因为我的映射器从map结构到达时返回null。

  • 问题内容: 我正在使用一个已定义的拦截器,我想从拦截器中通过DAO层进行db调用,所以我如何将Spring bean注入到struts拦截器中。是否可以将spring bean注入到struts拦截器中,任何人都可以提出任何想法在此。 问题答案: 编辑 由于不需要将拦截器声明为Spring bean,因此删除了不必要的部分。感谢@AleksandrM对其进行测试。 就像使用Actions一样,(如

  • 下面是我的DTO。 源DTO 目标DTO

  • 例如,我有以下接口映射器: 在代码中,您可以看到映射和一些默认方法,其中包含其他映射。如何在Mapstruct映射中使用这些方法,以便Mapstruct使用这些方法在字段中填充值?

  • 我试图使用MapStruct在dto和实体对象之间映射convert,但是生成的映射器实现只返回空的映射对象。 BeermapperImpl 任何人都可以提供我的代码可能出错的地方?谢谢!