Spring 4.0.x JSON/Ajax HTTP/1.1 406 不可接受

2023-12-28

我正在使用 Spring 4.0.5.RELEASE,Spring MVC 仅通过Java配置

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

我正在使用 Spring 关于 JSON 的默认配置。在一些@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 值。到这里一切都OK了。

现在我想集成 Spring MVC + (JSON AJAX)

我有这个教程如何参考Spring MVC:Ajax 和 JQuery http://fruzenshtein.com/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" or 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;

问题:当我更改 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>

缺什么?谢谢。


对于观众来说。

错误出现在同一个 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",

因为我有

@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 给予更多偏好。扩大header content

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring 4.0.x JSON/Ajax HTTP/1.1 406 不可接受 的相关文章

随机推荐