我正在尝试使用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从javax.inject获得相同的结果.
解决方法:
您可以使用Spring作为映射器的组件模型:
@Mapper(componentModel="spring")
public abstract class DeviceDataMapper {
...
}
这样你可以将依赖项注入其中(例如,它使用的其他手工编写)以及将映射器注入其他类而不是诉诸INSTANCE模式.