我正在使用带有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中的接口,我将非常感谢你。
由于
答案 0 :(得分:1)
假设你的 IVehicle 界面可以由一个类来表示,比如说,该类只有 IVehicle 接口的atrributes。我们称之为 MyVehicle
在界面中添加以下内容:
@JsonDeserialize(as = MyVehicle.class)
public interface IVehicle
答案 1 :(得分:0)
假设我们有许多接口实现。
假设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
注释。