- SpringMVC中JSON自动转化对象
-在进行api开发时,通过ajax在controller层直接传入一个对象方便又实用,但是细节方面却有很多技巧。
昨天晚上遇到的问题:controller能够识别到参数,但是传入的值全部为空,在网上找了很久,一般的解决办法是设置传入content的类型为application/json,导入fastjson的两个包,然鹅,这样并没有解决我的问题。最后自己设置成x-www-form-urlencode解决了。现在整理一下,给出自动转化对象的解决方案。
-entity对象:
- public class QueryString {
- String vcn;
- Integer vol;
- String spd;
- String textPut;
- String textType;
-
- @Override
- public String toString() {
- return "QueryString{" +
- "vcn='" + vcn + '\'' +
- ",vol=" + vol +
- ",spd='" + spd + '\'' +
- ",textPut='" + textPut + '\'' +
- ",textType='" + textType + '\'' +
- '}';
- }
-
- public String getVcn() {
- return vcn;
- }
-
- public QueryString setVcn(String vcn) {
- this.vcn = vcn;
- return this;
- }
-
- public Integer getVol() {
- return vol;
- }
-
- public QueryString setVol(Integer vol) {
- this.vol = vol;
- return this;
- }
-
- public String getSpd() {
- return spd;
- }
-
- public QueryString setSpd(String spd) {
- this.spd = spd;
- return this;
- }
-
- public String getTextPut() {
- return textPut;
- }
-
- public QueryString setTextPut(String textPut) {
- this.textPut = textPut;
- return this;
- }
-
- public String getTextType() {
- return textType;
- }
-
- public QueryString setTextType(String textType) {
- this.textType = textType;
-
- return this;
- }
- }
Controller层:
- @ResponseBody
- @RequestMapping(value = "/api/voice",method = RequestMethod.POST,produces =
-
- MediaType.APPLICATION_JSON_VALUE + ";charset=UTF-8"
-
- )
- public String voice(QueryString queryString) throws Exception {
-
- logger.debug(queryString.toString());
- try {
- System.out.println(queryString.toString());
- Result result = voiceService.getVoice(queryString);
- return JSON.toJSONString(result);
- } catch (IOException e) {
- e.printStackTrace();
- throw e;
- }
- }
Ajax提交的方法:
- $.ajax({
- type: 'post',url: "/api/voice",data: {"vcn": vcn,"vol": vol,"spd": spd,"textPut": textPut,"textType": textType},contentType: "application/x-www-form-urlencoded;charset=utf-8",success: function (res) {
- if (0 == res["status"]) {
- music = res['data'][0];
- $("#urls").html("<a>" + music + "</a>")
- $("#show_play").removeAttr('hidden');
- $("#show_play button").on('click',function () {
- window.location.href = music;
- });
-
- } else {
- layer.msg(res["msg"]);
- }
- $("#showTooltips").attr('class',"weui-btn weui-btn_primary");
- },error: function (res) {
- layer.msg("错误码:" + res.status);
- $("#showTooltips").attr('class',"weui-btn weui-btn_primary");
- }
- });
最好在WEB-INF/web.xml中设置一下乱码过滤器:
- <!--spring为我们提供的乱码过滤器-->
- <filter>
- <filter-name>CharacterEncodingFilter</filter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>utf-8</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>CharacterEncodingFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
这样就基本OK,ajax传入的是一个application/x-www-form-urlencode类型的对象,注意这里不是application/json,也没有通过JSON.stringify()格式化,在controller层中,我们通过直接对方法传入对象,获取到的request的数据的格式是通过RequestMapping指定的:
produces = MediaType.APPLICATION_JSON_VALUE + “;charset=UTF-8”
这样我们就可以通过Springmvc自动转化json参数为对象了。
注: maven中的Spring相关的依赖都是4.3.x