[英]Spring Rest Controller @RequestBody for an interface except a class
我正在使用帶有 POST 請求方法的 spring boot rest 控制器,具有 url (/add) 來持久化一個 JSON 對象,但在 RequestBody 內部它接受除類之外的接口。
控制器中的方法: (IVehicle是一個接口)
@CrossOrigin
@RequestMapping(value = "/add", method = RequestMethod.POST)
public ResponseEntity<IVehicle> addVehicle(@RequestBody IVehicle vehicle) {
vehicleService.addVehicle(vehicle);
return new ResponseEntity<IVehicle>(vehicleHttpStatus.CREATED);
}
注意: IVehicle是一個接口。
通過 AngularJS 傳遞的JSON 對象:
$http({
method : 'POST',
url : '../localhost/vehicle/add',
data : $scope.vehicle,
dataType : 'json',
headers : {'Content-Type' : 'application/json; charset=utf-8'}
}).then(function(response) {
console.log( response );
}, function(error) {
console.log( error );
});
錯誤[nio-8080-exec-5].wsmsDefaultHandlerExceptionResolver:無法讀取 HTTP 消息:org.springframework.http.converter.HttpMessageNotReadableException:JSON 解析錯誤:無法構造 com.matrix.domain.ui.IVehicle 的實例:抽象類型要么需要映射到具體類型,要么需要自定義反序列化器,要么包含額外的類型信息; 嵌套異常是 com.fasterxml.jackson.databind.JsonMappingException:無法構造 com.matrix.domain.ui.IVehicle 的實例:抽象類型要么需要映射到具體類型,要么具有自定義反序列化器,要么在 [來源:java.io.PushbackInputStream@5c46d800; 行:1,列:1]
請指導我如何訪問 JSON 對象 $scope.vehicle 作為 Rest Controller 中的接口,我將非常感謝你。
謝謝
假設您的IVehicle接口可以由一個類表示,比如說,該類僅具有IVehicle接口的所有屬性。 讓我們稱之為MyVehicle
將以下內容添加到您的界面:
@JsonDeserialize(as = MyVehicle.class)
public interface IVehicle
假設我們有一個接口的許多實現。 假設IVehicle
有實現CarVehicle
和BikeVehicle
,在這種情況下最好在interface
級別編寫解串器。
IVehicle 接口的實現
// interface which you will be used in @RequestBody
@JsonDeserialize(using = IVehicleDer.class)
interface IVehicle {}
@JsonDeserialize(as = CarVehicle.class)
class CarVehicle implements IVehicle {
@JsonProperty(value = "vehicle_type")
String vehicleType;
// getters and setters
}
@JsonDeserialize(as = BikeVehicle.class)
class BikeVehicle implements IVehicle {
@JsonProperty(value = "vehicle_type")
String vehicleType;
// getters and setters
}
interface IVehicle
的自定義解串器class IVehicleDer extends JsonDeserializer<IVehicle> {
@Override
public EventI deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException {
ObjectMapper mapper = (ObjectMapper) p.getCodec();
ObjectNode root = mapper.readTree(p);
if (root.has("vehicle_type") && root.get("vehicle_type").asText().equals("car")) {
return mapper.readValue(root.toString(), CarVehicle.class);
}
return mapper.readValue(root.toString(), BikeVehicle.class);
}
}
輸入 JSON
{
"vehicle_type": "bike"
}
以上 JSON 應該反序列化為BikeVehicle
類。 不要忘記在類的頂部寫@JsonDeserialize
注釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.