弹出控制器的AJAX JSON帖子返回HTTP 415

时间:2012-12-07 22:38:31

标签: java ajax json spring spring-mvc

我已经阅读了有关此问题的StackOverflow上的大多数帖子,并尝试过多次修复,最终没有解决我的问题。 Spring抛出HttpMediaTypeNotSupportedException: Content type 'application/json' not supported

我有一个如此定义的控制器:

 @RequestMapping(method = RequestMethod.POST, value = "/update")
 public @ResponseBody JSONDomainResponse update(@RequestBody Model inModel)

模型看起来如此:

public class Model implements Serializable {

private static final long serialVersionUID = 2738522159847487651L;
private String id;
private BigDecimal offset;

@JsonCreator
public Model(@JsonProperty("id") String id, @JsonProperty("offset") BigDecimal offset) {
  this.id = id;
  this.offset = offset;
}

public String getID() {
  return id;
}

public BigDecimal getOffset() {
  return offset;
}

public void setID(String id) {
  this.id = id;
}

public void setOffset(BigDecimal offset) {
  this.offset = offset;
}
}

我试图使用的AJAX调用如下所示:

$.ajax({
  type : 'POST',
  url : '/update',
  contentType : "application/json",
  data : JSON.stringify({"id":"test", "offset":300})
 });

我的context.xml文件中有<mvc:annotation-driven/>配置,我已经验证MappingJacksonHttpMessageConverter的canRead()方法为我的模型和JSON媒体类型返回true。

我也在我的类路径中指定了Jackson核心和映射器jar。

我注意到从控制器签名中删除Model参数使得我实际上通过我的帖子到达控制器,这让我相信我的模型存在一些问题。但是,由于记录的信息很少,我无法确定问题是什么。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我终于找到了问题的解决方案,这个问题很简单但完全不明显。

事实证明,我试图反序列化的Model对象是在一个名称不正确的包中,当Spring无法找到Model时,它只是吞下生成的异常并返回false。我通过在Spring-MVC中深入调试,特别是StdDeserializerProvider类来发现这一点。

对于那些收到此错误的人,我强烈建议您编写一些代码来验证此课程中发生的事情,例如:

@Test
public void testThatCanConvertUpdateModel() {
  MappingJacksonHttpMessageConverter conv = new MappingJacksonHttpMessageConverter();
  assertTrue(conv.canRead(YourModel.class, MediaType.APPLICATION_JSON));
}