@RequestBody,415Unsupported Media Type错误,解决办法汇总总有一款适合你

  • Post author:
  • Post category:其他


最近在跟ONENET平台对接设备数据的时候,从平台下载的JAVA版本的SDK嵌入到自己的项目中使用,使用POSTMAN测试GET请求的时候是没问题的,测试POST请求接收数据的时候就报了415错误!从网上找了各种解决办法,没有一款是适用我这个项目的,通通没用,后来发现是spring的注解@RequestBody接收数据的问题,后来就替换成原始接收数据的方法就可以了(HttpServletRequest)

由于SDK用的是BODY来处理的数据,所以我们需要把request中的参数转成字符串body

public String receive(HttpServletRequest request, HttpServletResponse rsp) throws NoSuchPaddingException, InvalidKeyException, NoSuchAlgorithmException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException, IOException {

        BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
        String body = IOUtils.read(reader);

}

IOUtils用的是dubbo-2.5.3

就这样困扰了两天的问题自己发现并自己解决(过程中找过ONNET平台技术员和设备厂商拉了个群聊把问题反馈出来一直没得到解决,最让我无语的是跟我对接的ONNET平台技术员是搞PYTHON,设备厂商的技术员是搞C#的跟他们搞对接真痛苦,因为他们自己的DEMO我不能直接拿来用)

下面说说,我这两天在网上找的解决办法,一般下面几种解决办法都足够解决你的问题,实在不行就用我上面的最原始的解决办法:

一、参考的是:

https://www.iteye.com/blog/snowolf-1628861

主要就是需要开启XML核心配置

  1. <context:component-scan base-package=”org.zlex.json.controller” />
  2. <context:annotation-config />
  3. <mvc:annotation-driven />

然后

pom.xml配置

<dependency>  
        <groupId>org.springframework</groupId>  
        <artifactId>spring-webmvc</artifactId>  
        <version>3.1.2.RELEASE</version>  
        <type>jar</type>  
        <scope>compile</scope>  
    </dependency>  
    <dependency>  
        <groupId>org.codehaus.jackson</groupId>  
        <artifactId>jackson-mapper-asl</artifactId>  
        <version>1.9.8</version>  
        <type>jar</type>  
        <scope>compile</scope>  
    </dependency>  
    <dependency>  
        <groupId>log4j</groupId>  
        <artifactId>log4j</artifactId>  
        <version>1.2.17</version>  
        <scope>compile</scope>  
    </dependency>  

二、参考的是

https://blog.csdn.net/jdk_wangtaida/article/details/85783289

@requestBody注解的使用

1、@requestBody注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,比如说:application/json或者是application/xml等。一般情况下来说常用其来处理application/json类型。

2. @RequestBody接收的是一个Json对象的字符串,而不是一个Json对象

解决方案:前端传参数时,设置content-type类型就可以啦,设置成application/json

三、参考的是

https://blog.csdn.net/g_y_x_/article/details/84339648

主要说的是检查JAR包和配置的问题

1.maven引入jackson包,共3个【重要】

jackson-core

jackson-databind

jackson-annotations

2.springmvc的配置文件【重要】

<mvc:annotation-driven />  

3.没有自动将包导入WEB-INF/lib中

四、这里说的是没有使用浏览器请求,被拒POSTMAN没有模拟浏览器POST

我一个同事说使用swagger测是不会包415的,是正常的

使用模拟浏览器工具测试

五、说的是JAR包不一致导致的

六、说的是spring3.0和spring4.0使用<mvc:annotation-driven />的差距

3.0的是

MappingJacksonHttpMessageConverter

4.0的是

MappingJackson2HttpMessageConverter
<mvc:annotation-driven>
		<mvc:message-converters>
			<!--<bean class="szsti.kettle.utils.conf.UTF8StringHttpMessageConverter" />-->
			<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
			<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
			<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
			<bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
			<!--<bean class="org.springframework.http.converter.SourceHttpMessageConverter"/>
			<bean class="org.springframework.http.converter.XmlAwareFormHttpMessageConverter"/>
			<bean class="org.springframework.http.converter.Jaxb2RootElementHttpMessageConverter"/>-->
		</mvc:message-converters>
	</mvc:annotation-driven>



版权声明:本文为qq459805661原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。