Spring REST控制器@RequestBody用于接口,除了类



我正在使用spring boot rest控制器带有post request方法,lurl(/add(持续一个json对象, unectbody 它接受接口除了 class

控制器中的方法:(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 是一个接口。

JSON对象通过AngularJS传递:

$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 );
});
.matrix.domain.ui.ui.ivehicle:抽象类型要么需要映射到混凝土类型,具有自定义的求职者,要么包含其他类型的信息;嵌套异常是com.fasterxml.jackson.databind.jsonmappingexception:无法构造com.matrix.matrix.domain.ui.ui.iehicle的实例:抽象类型需要映射到具体类型,具有自定义的deserialializer,或者在[[资料来源:java.io.pushbackinputstream@5c46d800;线:1,列:1]

请指导我如何访问json对象$ scope.Secope.Secope。作为剩余控制器中的接口,我会感谢您。

谢谢

假设您的 ivehicle 接口可以由类表示,例如,类,除了 ivehicle interface的protface的protributes,班级只有全部除了 intributes。让我们称其为 myVehicle

将以下内容添加到您的接口:

@JsonDeserialize(as = MyVehicle.class)
public interface IVehicle 

假设我们有许多接口的实现。假设IVehicle具有实现CarVehicleBikeVehicle,在这种情况下,最好在interface级别编写Deserialiser。

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注释。

最新更新