Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为mapstruct制作的抽象类内部自动连接_Java_Spring_Rest_Abstract Class_Mapstruct - Fatal编程技术网

Java 为mapstruct制作的抽象类内部自动连接

Java 为mapstruct制作的抽象类内部自动连接,java,spring,rest,abstract-class,mapstruct,Java,Spring,Rest,Abstract Class,Mapstruct,我正在尝试使用Spring构建一个REST控制器。为了格式化数据以提高可读性和集成度,我使用了Mapstruct。下面是我如何编写Mapper的 @Mapper public abstract class DeviceDataMapper { @Autowired DeviceService deviceService; public static DeviceDataMapper INSTANCE = Mappers.getMapper(DeviceDataMapper.class);

我正在尝试使用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。因此,我想知道是否有关于抽象类中自动连线资源的可访问性的一般规则?或者是我实例化的方式使此函数不可访问?我应该更改什么使其工作?我还尝试了
@Inject
from
javax.Inject
具有相同的结果。

为了让
@Autowired
工作,
DeviceDataMapper
类需要是一个Springbean。如果您自己实例化它,它将无法工作


将其设置为SpringBean并像使用SpringBean一样使用,或者从控制器向其传递对设备服务的引用。

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

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

通过这种方式,您可以将依赖项注入到映射器中(例如,它使用的其他手写体),也可以将映射器注入到其他类中,而不是求助于
实例
模式。

我还建议使用Spring作为映射器的组件模型:@mapper(componentModel=“Spring”公共抽象类DeviceDataMapper{…}。通过这种方式,您可以将其注入(生成的实现将是一个SpringBean),而不是求助于
实例
模式。@Gunnar这应该是一个独立(且被接受)的答案。使用Spring组件模型方法与实例模式相比有什么优势吗?