【问题标题】:Spring mvc server. Trying to post json into controller (The server refused this request )春天mvc服务器。试图将 json 发布到控制器中(服务器拒绝了这个请求)
【发布时间】:2016-05-13 13:09:09
【问题描述】:

我在视图端有以下 json 请求

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script type="text/javascript" >
$(document).ready(function(){
  sendAjax();
});

function sendAjax() {

$.ajax({
    url: "/shop/main/order/model",
    type: 'POST',
    dataType: 'json',
    data: " { \"totalPrice\": 10, \"custumerName\":\"vasiya\", \"ItemsList\": [ { \"id\": 1,\"name\":\"qqq\",  \"price\": 10, \"count\": 2 } ] }",
    contentType: 'application/json',
    mimeType: 'application/json',
    success: function(data) {
        alert(data.totalPrice + " " + data.custumerName);
    },
    error:function(data,status,er) {
        alert("error: "+data+" status: "+status+" er:"+er);
    }
});
}
</script>

</body>
</html>

controller 看起来像这样

   @Controller
@RequestMapping("/order")
public class OrderController {

     @RequestMapping(value="/model", method = RequestMethod.POST)
        public @ResponseBody  OrderModel post(@RequestBody final  OrderModel model) {
            System.out.println(model.getItemsList());
            System.out.println(model.getTotalPrice());

            return model;
        }


    }
}

OrderModel.java

public class OrderModel implements Serializable {
    private static final long serialVersionUID = 1L;
    String custumerName;
    int totalPrice;
    Items[] itemsList;

    public void setTotalPrice(int totalPrice) {
        this.totalPrice = totalPrice;
    }

    public void setItemsList(Items[] itemsList) {
        this.itemsList = itemsList;
    }

    public int getTotalPrice() {

        return totalPrice;
    }

    public Items[] getItemsList() {
        return itemsList;
    }

    public void setCustumerName(String custumerName) {
        this.custumerName = custumerName;
    }

    public String getCustumerName() {

        return custumerName;
    }

    public OrderModel(String custumerName, int totalPrice, Items[] itemsList) {
        this.custumerName = custumerName;

        this.totalPrice = totalPrice;
        this.itemsList = itemsList;
    }
}

Items.java 是一个简单的 POJO 类,专为映射休眠实体而设计,仅包含 String 和 long 类型字段。

因此,当我尝试访问 index.html 时,它不会发回任何响应。在浏览器的控制台中,我得到以下信息:

POST http://localhost:8080/shop/main/order/model415 ()

HTTP 状态 415 -

输入状态报告

消息

描述:服务器拒绝了这个请求,因为请求实体 所请求的资源不支持的格式 请求的方法。

【问题讨论】:

  • 乍一看,我发现请求正文中的那些\"有点奇怪。试试这个data: { totalPrice: 10, custumerName:'vasiya', ItemsList: [ {id: 1,name:'qqq', price: 10, count: 2 } ] },
  • 不,问题仍然存在
  • 让我指点你here。也许是@RequestMapping中缺少的consumes="application/json"
  • 是的,我已经注意到了,但还是不行
  • 我尝试通过邮递员模仿同样的请求,得到同样的错误,看来是服务器端的问题

标签: ajax spring spring-mvc


【解决方案1】:

我从您的代码中发现了 2 件事。 1. 您的应用程序中需要一个 messageConverter。

要添加消息转换器,您需要在 pom.xml 中添加这两个依赖项。检查适用于您的正确版本。

<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.7.3</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.13</version>
    </dependency>

2。在您的 dispature-servlet.xml 或您正在使用的任何 mvc 配置文件中添加以下 bean。

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
        </list>
    </property>
</bean>

在此之后,您将不会得到 415,因为您的应用程序会找到正确的消息转换器。

  1. 您的 OrderModel 实体缺少默认构造函数,一旦您执行上述 2 个步骤,就会出错。所以添加一个默认构造函数。

    public OrderModel() {    }
    

【讨论】:

  • 你说得对!非常感谢。但是没有额外的bean定义它可以正常工作。真的有必要吗?我已经在 pom 中有 jackson-mapper-asl,但没有 jackson-databind 和默认构造函数。-似乎这两个是主要问题。
  • 你能把你的dispatcher-servlet.xml发给我吗?当我尝试不使用消息转换器并得到 415 时。所以我添加了它。
  • 我想我的上下文配置文件中缺少 。添加后。我们不需要定义那个消息转换器 bean。
【解决方案2】:

您正在发送 ItemsList,但在您的班级中是 itemsList

【讨论】:

  • 哦,谢谢,真是个尴尬的错误,但结果还是一样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 2023-03-27
相关资源
最近更新 更多