spring: 客戶端請求報 "HTTP 415" 錯誤 之 解法
阿新 • • 發佈:2019-02-19
凶案敘述
1.1 時間
昨天晚上
1.2 地點
家中
1.3 人物
一名程式設計師、一名燈光師、一名電腦維修員 (其實都是我 。。)
1.4 起因
在倒持增刪使用者操作的method,引數是User型別(自定義類),寫法如下。
@RequestMapping(value="/add", method=RequestMethod.POST, procedures="application/json; utf-8") @ResponseBody public String addSomething(@RequestBody User user) { // Handle it return "something is added!"; }
客戶端(Android裝置)呼叫這個介面:
public static void addNewUser(final User user, final MyResponseCallback responseHandler) {
final RequestParams params = HttpUtil.getRequestParams();
params.put("user", user);
HttpUtil.sendPost(UrlFunctions.JSONRPC_addUser, params, responseHandler);
}
問題來了,客戶端打印出狂妄的錯誤日誌:
....省略...
HTTP 415: the request entity is in a format not supported by the requested resource method.
....省略...
1.5 經過
在排除掉他殺(比如有黑客在整我)後,我在想,它是怎麼死的呢?怎麼死的這麼不明不白呢?
有點詭異的理由:若將User 換用基本型別比如int、string後,客戶端同樣用int、string去作呼叫引數就沒有這個問題,說明是複合型別才會出錯。
於是網上搜巡相關文章,發現一大片,大喜過望,典型的解決辦法:
1)添加註解驅動標籤:<mvc:annotation-driven />;
2)新增jackson jar:
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
綜合一句主席們說過的話:擼起袖子加油幹,實踐是檢驗真理的標準。
按照上面的解決辦法試了下,還是報錯,並且是一樣的錯誤日誌。我發現如果那4個字母沒說出口,我會真的很難受,如果對於明天沒有要求,你還發拉秧的帖子搞啥子咯?
終於,找到第 3)種武器:在配置裡新增請求和註解POJO的對映:
<!-- 定義自動轉換為json資料格式 -->
<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
<!-- 啟動Spring MVC的註解功能,完成請求和註解POJO的對映 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jacksonMessageConverter"/>
</list>
</property>
</bean>
這個是根據你的spring版本來的:參考 這裡
不過這些都不是重點,重點是請再回顧一下你的Controller裡的方法:是不是不對勁??對頭,@RequestBody 應該換成 @RequestParam !!!
1.6 結果
請求成功!不存在報錯了!2. 總結
主要是檢查不夠仔細,然後日誌也有誤導搞得四周找對策! ╮(╯▽╰)╭ 粗心大意了
不禁要問,,今天晚上,難道又有案子待破嗎