引言
在开发过程中会遇到这种各样的bug,也是自己吃过的亏。以后在这里会把自己遇到的bug记录下来,吸取教训,避免犯同样的错误。
踩坑记录
在与第三方对接的接口中,对方推送消息接口定义如果接收成功返回success,反之返回其他字符串,如果不是success字符串就会再重复推送三次。自己在代码中为:
1 2 3 4 5 6
| @RequestMapping(value = "", method = RequestMethod.POST) @ResponseBody public String callBack() { return "success"; }
|
这段代码自我感觉没问题,但是线上发现即使返回的是success字符串也会重复推送。让对方排查了下,对方说我们推送的不是success字符串。WTF?看了日志*result[success]*没问题啊,直到自己亲自调试了下接口:
1 2 3 4
| String result = getResult();
System.out.println(""\success\"".equals(result));
|
发现接口返回值success被加上了双引号。
原因
在SpringMVC中使用@ResponseBody注解时会强制返回json格式,在返回字符串时会默认加上双引号。这才导致返回的字符串多了双引号。
解决方法
解决方法也很简单。只需要添加字符串解析器,避免String类型直接解析成JSON。
方法一:jackson
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg ref="utf8charset"/> <property name="writeAcceptCharset" value="false"/> </bean> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="serializationInclusion"> <value type="com.fasterxml.jackson.annotation.JsonInclude.Include">NON_NULL</value> </property> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
|
方法二:fastjson
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <mvc:annotation-driven> <mvc:message-converters register-defaults="false"> <bean class="org.springframework.http.converter.StringHttpMessageConverter"/> <bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
|