1. 程式人生 > >spring: 客戶端請求報 "HTTP 415" 錯誤 之 解法

spring: 客戶端請求報 "HTTP 415" 錯誤 之 解法

凶案敘述

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. 總結

主要是檢查不夠仔細,然後日誌也有誤導搞得四周找對策! ╮(╯▽╰)╭ 粗心大意了

不禁要問,,今天晚上,難道又有案子待破嗎