6

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 は、1 つの詳細を除いて正常に返されます。この関数にアクセスできませんでしたdeviceService.findDeviceTemplateById(toDevice.getDeviceTemplateId()(deviceService は自動配線されています)。エラー スタック トレースに NullPointerException が表示されます。抽象クラスの自動配線されたリソースのアクセシビリティに関する一般的なルールがあるかどうか疑問に思っていますか? または、この関数にアクセスできないようにするインスタンス化の方法はありますか? 機能させるには何を変更すればよいですか?私も同じ結果で@Injectfromを試しました。javax.inject

4

2 に答える 2

23

マッパーのコンポーネント モデルとして Spring を使用できます。

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

INSTANCEそうすれば、パターンに頼る代わりに、それに依存関係を注入したり(たとえば、それが使用する他の手書き)、マッパーを他のクラスに注入したりできます。

于 2016-12-14T19:47:24.583 に答える
8

が機能する@Autowiredには、DeviceDataMapperクラスが Spring Bean である必要があります。自分でインスタンス化すると機能しません。

それを Spring Bean にして同じように使用するかdeviceService、コントローラーからへの参照を渡します。

于 2015-05-08T09:55:59.130 に答える