Spring Rest Controller @RequestBody用于除类之外的接口

时间:2018-02-27 10:50:26

标签: java spring spring-boot spring-restcontroller

我正在使用带有POST请求方法的spring boot rest控制器,让url(/ add)持久保存JSON对象,在RequestBody中它接受接口除了a的

控制器中的方法:(IVehicle是界面

<key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>fbYYYYYYYYYYYYYY</string>

            </array>
        </dict>
    </array>

注意: IVehicle 是一个界面。

JSON对象正在通过VIA AngularJS传递:

@CrossOrigin 
@RequestMapping(value = "/add", method = RequestMethod.POST) 
public ResponseEntity<IVehicle> addVehicle(@RequestBody IVehicle vehicle) {

    vehicleService.addVehicle(vehicle); 
    return new ResponseEntity<IVehicle>(vehicleHttpStatus.CREATED); 

}
  

错误 [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; line:1,column:1]

请指导我如何访问JSON对象$ scope.vehicle作为Rest Controller中的接口,我将非常感谢你。

由于

2 个答案:

答案 0 :(得分:1)

假设你的 IVehicle 界面可以由一个类来表示,比如说,该类只有 IVehicle 接口的atrributes。我们称之为 MyVehicle

在界面中添加以下内容:

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

答案 1 :(得分:0)

假设我们有许多接口实现。 假设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注释。