2014-09-23 73 views
0

我和春天4.0.5.RELEASE,Spring MVC的工作只通過Java的配置春4.0.x的JSON/Ajax的HTTP/1.1 406無法接受

我在我的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

好吧,我有以下約JSON與AJAX(通過選擇或組合框的工作負載第二組或集合)

注: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是serializables

public class Categoria implements Serializable { 

    private static final long serialVersionUID = 5655804710111228325L; 

public class Producto implements Serializable { 

    private static final long serialVersionUID = -6362590479124787529L; 

問題:當我改變選擇HTML元素的值,我始終接收HTTP/1.1 406不可接受(見兩個連接的圖像)

Error Message 01

Error Message 02

順便說一句:服務器端永遠不會被調用。

我已經閱讀過SO上的其他文章。幾乎所有人都會提及傑克遜,並且基於Spring 3.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> 

缺少什麼?謝謝。

回答

0

面向觀衆。

錯誤發生在同一個URL中。 它包含.htm

因此,對於所有的開發者一定要刪除它

@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()); 
} 

@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()); 
} 

來源:

$.ajax({ 
    url: "/spring-utility/facturaajax/findallproductobycategoria.htm" , 
    data: JSON.stringify(json), 
    dataType: 'json', 
    type: "POST", 

要:

$.ajax({ 
    url: "/spring-utility/facturaajax/findallproductobycategoria" , 
    data: JSON.stringify(json), 
    dataType: 'json', 
    type: "POST", 

因爲我有

@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); 
} 

春給出關於URL更偏好。擴展名內容