【问题标题】:Autowiring inside abstract class made for mapstruct在为 mapstruct 制作的抽象类中自动装配
【发布时间】:2015-07-19 04:38:02
【问题描述】:

我正在尝试使用 Spring 构建一个 REST 控制器。为了格式化数据以提高可读性和集成度,我使用了 Mapstruct。以下是我编写 Mapper 的方式。

@Mapper
public abstract class DeviceDataMapper {

@Autowired
DeviceService deviceService;

public static DeviceDataMapper INSTANCE = Mappers.getMapper(DeviceDataMapper.class);

@Mappings({
    @Mapping(source = "deviceId", target = "iddevice"),
    @Mapping(source = "deviceName", target = "name")
})
public abstract TODevice deviceToTODevice(DeviceData device);

public DeviceData toDeviceToDeviceData(TODevice toDevice){
    DeviceData deviceData = new DeviceData();
    deviceData.setDeviceId(toDevice.getIddevice());
    deviceData.setDeviceName(toDevice.getName());
    deviceData.setDeviceTemplateId(toDevice.getDeviceTemplateId());
    try {
deviceData.setDeviceTemplateName(deviceService.findDeviceTemplateById(toDevice.getDeviceTemplateId()).getName());
    } catch (Exception e) {
        e.printStackTrace();
    }

    return deviceData;
}}

API 控制器函数如下所示

@RequestMapping(value = "/{deviceId}",method = RequestMethod.GET)
public @ResponseBody DeviceData get(@PathVariable int deviceId) {
    DeviceData deviceData=new DeviceData();
    try {
        deviceData =    DeviceDataMapper.INSTANCE.toDeviceToDevice(deviceService.findOne(deviceId));
    } catch (Exception e) {
        e.printStackTrace();
    }
    return deviceData;
}

除了一个细节外,输出的 deviceData 返回正常。我无法使用此功能deviceService.findDeviceTemplateById(toDevice.getDeviceTemplateId()(其中 deviceService 是自动装配的)。错误堆栈跟踪显示 NullPointerException。所以我想知道是否有关于抽象类中自动装配资源的可访问性的一般规则?还是我实例化的方式使该功能无法访问?我应该改变什么才能让它工作?我也尝试使用来自javax.inject@Inject,结果相同。

【问题讨论】:

    标签: java spring rest abstract-class mapstruct


    【解决方案1】:

    您可以使用 Spring 作为映射器的组件模型:

    @Mapper(componentModel="spring")
    public abstract class DeviceDataMapper {
        ...
    }
    

    这样,您可以将依赖项注入其中(例如,它使用的其他手写)以及将映射器注入其他类,而不是诉诸INSTANCE 模式。

    【讨论】:

    • 使用 spring 组件模型方法与实例模式相比有什么优势吗?
    【解决方案2】:

    为了使@Autowired 工作,DeviceDataMapper 类需要是一个 Spring bean。如果你自己实例化它是行不通的。

    要么将其设为 Spring bean 并像使用它一样使用它,要么将 deviceService 的引用从控制器传递给它。

    【讨论】:

    • 我还建议使用 Spring 作为映射器的组件模型:@Mapper(componentModel="spring" public abstract class DeviceDataMapper { ... }。这样你就可以注入它(生成的实现将是一个 Spring bean)而不是诉诸 INSTANCE 模式。
    • @Gunnar 这应该是一个独立(并且被接受)的答案。 Reference
    猜你喜欢
    • 2023-01-31
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    相关资源
    最近更新 更多