簡體   English   中英

Spring Rest Controller @RequestBody 用於除類之外的接口

[英]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有實現CarVehicleBikeVehicle ,在這種情況下最好在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM