Spring mvc服务器。试图将json发布到控制器(服务器拒绝了此请求)

时间:2016-05-13 13:09:10

标签: ajax spring spring-mvc

我在视图方面有以下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类,用于映射hibernate实体,仅包含String和long类型字段。

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

发布http://localhost:8080/shop/main/order/model 415()

  

HTTP状态415 -

     

输入状态报告

     

消息

     

description:服务器拒绝了此请求,因为请求实体   是所请求的资源不支持的格式   要求的方法。

2 个答案:

答案 0 :(得分:0)

您要发送 ItemsList ,但在您的课程中, itemsList

答案 1 :(得分:0)

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

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

<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() {    }