Spring RequestBody 的使用

本文介绍如何使用Spring MVC接收前端发送的JSON数据,并解决415 Unsupported MediaType错误。需引入Jackson依赖并配置mvc:annotation-driven。

使用Spring的RequestMapping 接收一个数组,本来有一种方式,是让 客户端 发送多个同样的参数,然后服务器端就可以接收到数组了

服务器端:

  @RequestMapping(value="/add",method=RequestMethod.POST)
  @ResponseBody
  public String addAgency(String agencyName, String [] storeNames) {
    ....
  }


客户端:
    agencyName: "agency-1"
    storeNames: "store-1"
    storeNames: "store-2"

但是这样写,前端的JS 有点怪怪的,最好的方式是,前端发送过来一个 Json 数据,然后后端直接接收到进行处理。 所以就有了下面的方式:

使用Spring的RequestBody 接收数据。代码如下:

服务端: 

  @RequestMapping(value="/add",method=RequestMethod.POST)
  @ResponseBody
  public String addAgency(@RequestBody BbtAgencyParamVO bbtAgencyParamVO) {
        ....
  }

public class BbtAgencyParamVO  implements Serializable{

  private static final long serialVersionUID = 502698704597823067L;

  private String agencyName;

  private List<String> storeNames;

  public String getAgencyName() {
    return agencyName;
  }

  public void setAgencyName(String agencyName) {
    this.agencyName = agencyName;
  }

  public List<String> getStoreNames() {
    return storeNames;
  }

  public void setStoreNames(List<String> storeNames) {
    this.storeNames = storeNames;
  }

}
JS:

function addAgency(agencyName, storeName) {

    var originalData = {
        agencyName: agencyName,
        storeNames: storeName   
    };

    $.ajax({
        url: '/agency/add.htm',
        type: 'POST',
        dataType: 'json',
        contentType : 'application/json', 
        data: JSON.stringify(originalData),
        success: function (data) {
            if (data.resultCode == 1) {
                alert('添加成功');
                //window.location.reload();
            }
        }
    });
}

但修改之后,有一个问题,就是报以下错误: 415 Unsupported Media Type
了解了之后,发现,其实是 服务器端已经收到数据了, 但是客户端传送的 contentType是: application/json,转换不成对应的Object.

原因是: Spring需要有对应的MessageConverter 对 application/json 类型的content进行转换
改进:
1. 引进 Jackson 转换类
2. 让Spring自动加载相应的 messageConverter 类

jackson 转换包:

    <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.4.4</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.4.4</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.4.4</version>
        </dependency>   

在 spring-mvc 中 添加 annotation


xmlns:mvc="http://www.springframework.org/schema/mvc"

xsi:schemaLocation="
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"

<mvc:annotation-driven />

会自动注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter两个bean。
AnnotationMethodHandlerAdapter 将会初始化 7 个转换器,可以通过调用AnnotationMethodHandlerAdapter的getMessageConverts()方法来获取转换器的一个集合 List.

ByteArrayHttpMessageConverter 
StringHttpMessageConverter 
ResourceHttpMessageConverter 
SourceHttpMessageConverter 
XmlAwareFormHttpMessageConverter 
Jaxb2RootElementHttpMessageConverter 
MappingJacksonHttpMessageConverter

对于json的解析就是通过MappingJacksonHttpMessageConverter转换器完成的

In HTTP,
Content-Type is used in request and response payloads to convey the media type of the current payload.
Accept is used in request payloads to say what media types the server may use in the response payload


refer:
http://www.cnblogs.com/qq78292959/p/3761646.html
http://stackoverflow.com/questions/19396696/415-unsupported-media-type-post-json-to-odata-service-in-lightswitch-2012

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值