Spring 4.0.x JSON / Ajax HTTP / 1.1 406不可接受
问题内容:
我正在通过Java Config使用Spring 4.0.5.RELEASE和Spring MVC
我的pom.xml中包含以下内容:
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>${jackson.version}</version>
</dependency>
Where <jackson.version>1.9.13</jackson.version>
我正在使用有关JSON的Spring默认配置。在某些情况下,@Controller
我有以下几点:
@RequestMapping(value="/getjsonperson",
method=RequestMethod.GET,
produces=MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody Person getJSONPerson(){
logger.info("getJSONPerson - getjsonperson");
return PersonFactory.createPerson();
}
@RequestMapping(value="/getperson.json", method=RequestMethod.GET)
public @ResponseBody Person getPersonJSON(){
logger.info("getPerson - getpersonJSON");
return PersonFactory.createPerson();
}
并且工作正常。我可以在浏览器中看到返回的JSON值。到这里为止
一切正常。
现在我想集成Spring MVC +(JSON AJAX)
我有本教程如何参考Spring MVC:Ajax和JQuery
好的,关于AJAX的JSON,我有以下内容(通过选择框或组合框加载第二个集合或集合)
注意:URL是静态的,即使我仅使用/spring- utility/facturaajax/findallproductobycategoria.htm该问题仍然存在
$("#categoria").change(function(event){
var json = {"id" : $(this).find("option:selected").val(), "nombre" : $(this).find("option:selected").text() };
$.ajax({
url: "http://localhost:8080/spring-utility/facturaajax/findallproductobycategoria.htm" ,
data: JSON.stringify(json),
type: "POST",
beforeSend: function(xhr) {
xhr.setRequestHeader("Accept", "application/json");
xhr.setRequestHeader("Content-Type", "application/json");
},
success: function(products) {
alert("all fine!!!!");
}
});
//event.preventDefault();
});
关于控制器我有以下内容来处理ajax进程
@RequestMapping(value="/findallproductobycategoria.htm",
method=RequestMethod.POST,
consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody Set<Producto> findAllProductoByCategoria(@RequestBody Categoria categoria){
logger.info("findAllProductoByCategoria: {}", categoria.toString());
return this.fakeMultipleRepository.findAllProductoByCategoria(categoria.getId());
}
即使我使用headers=”Accept=application/json”还是headers=”Content- Type=application/json”问题仍然存在。
POJO是可序列化的
public class Categoria implements Serializable {
private static final long serialVersionUID = 5655804710111228325L;
public class Producto implements Serializable {
private static final long serialVersionUID = -6362590479124787529L;
The problem :问题:当我更改select html元素的值时,我始终会收到HTTP / 1.1 406不可接受的消息(请参见下面的两个图像)
顺便说一句:永远不会调用服务器端。
我已经阅读过SO上的其他文章。实际上,它们都提到了Jackson,并且基于Spring3.2.x。
即使我添加以下内容,问题仍然存在
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-jaxrs</artifactId>
<version>${jackson.version}</version>
</dependency>
Thank You.
问题答案:
对于观众。
错误在同一URL中。它包含了.htm
因此,对于所有开发人员,请务必将其删除
From
@RequestMapping(value="/findallproductobycategoria.htm", method=RequestMethod.POST,
consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody Set<Producto> findAllProductoByCategoria(@RequestBody Categoria categoria){
logger.info("findAllProductoByCategoria: {}", categoria.toString());
return this.fakeMultipleRepository.findAllProductoByCategoria(categoria.getId());
}
To
@RequestMapping(value="/findallproductobycategoria", method=RequestMethod.POST,
consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody Set<Producto> findAllProductoByCategoria(@RequestBody Categoria categoria){
logger.info("findAllProductoByCategoria: {}", categoria.toString());
return this.fakeMultipleRepository.findAllProductoByCategoria(categoria.getId());
}
From:
$.ajax({
url: "/spring-utility/facturaajax/findallproductobycategoria.htm" ,
data: JSON.stringify(json),
dataType: 'json',
type: "POST",
To:
$.ajax({
url: "/spring-utility/facturaajax/findallproductobycategoria" ,
data: JSON.stringify(json),
dataType: 'json',
type: "POST",
Because I have
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
Map<String,MediaType> mediaTypes = new LinkedHashMap<>();
mediaTypes.put("json", MediaType.APPLICATION_JSON);
mediaTypes.put("xml", MediaType.APPLICATION_XML);
configurer.mediaTypes(mediaTypes);
configurer.defaultContentType(MediaType.TEXT_HTML);
}
Spring提供了更多关于URL .extension的偏好,而不是标题内容