我有两个课程A
&正在实现接口的B
。
public class A implements MyInterface {
// Class A stuff
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class B implements MyInterface {
//Class B stuff
private MyCustomClass myCustomclass;
public String getName() {
this.myCustomclass.getName();
}
}
public interface MyInterface {
public String getName();
}
我想使用单个控制器方法,它可以在A和B上工作,具体取决于前端发送的对象。因此,当我尝试使用Interface时,Spring抱怨找不到合适的消息转换器。
@RequestMapping(value = "/mymethod", method = RequestMethod.POST) public String updateRecord(@RequestBody MyInterface myInterface, HttpServletResponse response) { //Do stuff }
答案 0 :(得分:2)
杰克逊可以确定使用哪个实现来序列化为JSON,但是它无法确定使用哪个实现反序列化JSON。对于序列化,它需要做的就是调用getClass()并为该类型构建一个序列化器。但是在反序列化时(目前)没有这样的类型信息。您应该使用Jackson注释@JsonTypeInfo
和@JsonSubTypes
来实现多态json。
@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type")
@JsonSubTypes({@JsonSubTypes.Type(value = A.class, name = "A"),
@JsonSubTypes.Type(value = B.class, name = "B")})
public interface MyInterface {
}
然后请求正文myInterface
必须是,
{type:'A', name:'My name'}
或{type:'B', myCustomclass:{....}}
参考这三个:
Spring MVC @RequestBody into an Interface instead of a class
https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization
Spring @RequestBody containing a list of different types (but same interface)
答案 1 :(得分:0)
您是否尝试过传递Object类或传递泛型类型引用
public String updateRecord(@RequestBody Object obj,..
或
public String updateRecord(@RequestBody T obj,.. (I am not sure for this)
然后在控制器方法中检查instanceOf。
谢谢, SAURABH
答案 2 :(得分:0)
根据我的理解,spring / jackson将无法识别要创建的对象类型,除非传入的json明确提到相同的对象。请参阅下面的链接,它讨论了抽象类。基本上有多种方法可以实现这一点,使用jsonTypeinfo或参数解析器等。检查这是否有帮助。 Abstract classes and Spring MVC @ModelAttribute/@RequestParam