Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax Spring MVC+;@ResponseBody+;遗产_Ajax_Json_Spring - Fatal编程技术网

Ajax Spring MVC+;@ResponseBody+;遗产

Ajax Spring MVC+;@ResponseBody+;遗产,ajax,json,spring,Ajax,Json,Spring,我有一个类层次结构。在它的顶部有一个抽象的AnswerUnit类。有两个继承类:OpenQuestionAnswer和MultipleChiceQuestionAnswer 我有一个.jsp表单,通过AJAX请求将数据(对象序列化为JSON)发送到服务器,并在控制器中有一个方法来处理它 @RequestMapping(value = "/test", method = RequestMethod.POST) public @ResponseBody String testPost

我有一个类层次结构。在它的顶部有一个抽象的AnswerUnit类。有两个继承类:OpenQuestionAnswer和MultipleChiceQuestionAnswer

我有一个.jsp表单,通过AJAX请求将数据(对象序列化为JSON)发送到服务器,并在控制器中有一个方法来处理它

@RequestMapping(value = "/test", method = RequestMethod.POST)
    public @ResponseBody
    String testPostMethod(@RequestBody
    OpenQuestionAnswer answer) {
        return "home";
    }
我希望能够以“AnswerUnit answer”作为参数(抽象类型而不是具体类型,因此我可以用一种方法处理来自不同视图的请求)。当我尝试这样做时,出现了一个问题-服务器响应是

400错误请求客户端发送的请求在语法上不正确。

我认为原因是Spring(Jackson?)无法找到他应该创建和使用的具体类。 在客户端,我知道发送给服务器的类的类型。
告诉服务器应该创建并用我的请求填充哪个具体类的正确方法是什么

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

您可以使用Jackson多态类型处理来实现这一点

@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中添加“type”字段。

我想我的响应已经晚了,但无论如何:)

您可以使用Jackson多态类型处理来实现这一点

@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
...

但是您需要将“type”字段添加到您的客户端JSON中。

在您的示例中,您显示了一个具体的类型-
OpenQuestionAnswer
,即使使用具体的类型,您是否也会遇到此错误?您是否可以尝试降低日志级别以进行调试,并查看是否还有其他明显的问题,但您是否在JSON帖子中引用了具体类的方法(不能假设没有看到代码)?您可能不得不放弃继承而改为使用组合()在您的示例中,您显示了一个具体类型-
OpenQuestionAnswer
,即使是具体类型,您是否也会遇到此错误?您是否可以尝试降低日志级别以进行调试,并查看是否还有其他明显的问题,但您是否在JSON帖子中引用了具体类的方法(不能假设没有看到代码)?你可能不得不放弃继承,转而使用合成()太棒了!谢谢你,太棒了!谢谢你/