最近在跟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核心配置
- <context:component-scan base-package="org.zlex.json.controller" />
- <context:annotation-config />
- <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>