2012-08-11 90 views
0

我有一个类层次结构。它的顶部有一个抽象的AnswerUnit类。有两个继承类:OpenQuestionAnswer和MultipleChoiceQuestionAnswer。@ResponseBody +继承Spring MVC + JSON

我有一个.jsp表单发送数据(对象序列化为JSON)到服务器与AJAX请求和控制器中的方法来处理它。

@RequestMapping(value = "/test", method = RequestMethod.POST) 
    public @ResponseBody 
    String testPostMethod(@RequestBody 
    OpenQuestionAnswer answer) { 
     return "home"; 
    } 

我希望能够采取“AnswerUnit回答”作为参数(抽象类型,而不是具体类型,这样我就可以从不同的角度处理请求的一个方法)。当我尝试这样做有一个问题 - 服务器respose是

400 BAD REQUEST he request sent by the client was syntactically incorrect.

我认为,原因是春季(杰克逊?)是不是能够找出具体的类,他应该创建和使用。 在客户端,我知道我发送到服务器的类是什么类。 什么是正确的方式告诉服务器应该创建哪个具体类并填充我的请求?

+0

在你的示例中,你已经展示了一个具体的类型 - “OpenQuestionAnswer”,即使使用具体类型,你是否得到了这个错误?你可以尝试降低日志级别DEBUG,看看是否有其他东西显示 – 2012-08-11 15:08:24

+0

似乎很明显,但你是否在你的JSON POST中引用方法到你的具体类(不能认为没有看到代码)?你可能不得不放弃继承,并用组合来代替(http://stackoverflow.com/questions/2399544/difference-between-inheritance-and-composition) – nickdos 2012-08-12 06:11:14

回答

2

我想我有反应来晚了,但无论如何:)

http://wiki.fasterxml.com/JacksonAnnotations

您可以使用此杰克逊多态型搬运

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") 
@JsonSubTypes(value = { 
    @JsonSubTypes.Type(name = "answer", value = OpenQuestionAnswer.class), 
    @JsonSubTypes.Type(name = "multiple", value = MultipleChoiceQuestionAnswer.class) 
}) 
public class AnswerUnit 
... 

但你需要添加“型“字段到您的客户端JSON。

+1

太棒了!谢谢你o / – bosco 2017-08-08 20:29:23