我有一個彈簧控制器方法,這需要String
爲一體的RequestBody
像這樣整體後反序列化無引號字符串:傑克遜+ Spring的web無法修改消息變換器
@RequestMapping(method=RequestMethod.POST)
public @ResponseBody DTO method(@PathVariable("userId") long userId, @RequestBody String page) {
// Controller contents here
}
以前,我已經能夠發佈「裸體」字符串到這個方法,這是請求與一個字符串作爲正文(而不是一個JSON對象)。例如(從Chrome瀏覽器開發工具):
這停止工作後,我試圖將Jackson Hibernate 4 module添加到Jackson2ObjectMapperFactoryBean(處理休眠懶惰集合),用我的XML配置文件中的以下內容:
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="modulesToInstall"
value="com.fasterxml.jackson.datatype.hibernate4.Hibernate4Module"/>
<property name="featuresToEnable">
<array>
<util:constant static-field="com.fasterxml.jackson.core.JsonParser.Feature.ALLOW_SINGLE_QUOTES"/>
</array>
</property>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
定製ObjectMapper這樣之後我張貼如上的請求時,收到以下錯誤:
org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: Unrecognized token 'Testing': was expecting ('true', 'false' or 'null')
at [Source: [email protected]; line: 1, column: 13]; nested exception is com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'Testing': was expecting ('true', 'false' or 'null')
at [Source: [email protected]; line: 1, column: 13]
角落找尋該(使用角JS)的作業是張貼到API之前調用JSON.stringify()
,所以角代碼變得
$http.post(Url + userId, JSON.stringify(string)).then(function (result) {
return result.data;
});
和請求變得
此之後API的工作方式與之前一樣,只接受字符串。
雖然我知道一個沒有包含的字符串"
不是一個有效的JSON字符串,但我不明白爲什麼在這種情況下更改ObjectMapper bean會產生這樣的差異?如果這是所有有用的信息,我正在使用spring 4.3.4版和jackson 2.8.5版。
調度servlet的樣子[這](HTTP前:/ /pastie.org/private/s5e1lpwrvfluoeyuj1nifa)。在我的應用程序上下文中與jackson沒有任何關係:我認爲這只是使用spring的默認設置。我發現即使添加'標籤也足以觸發這種行爲。我將研究使用'Content-type:text/plain',但我很驚訝試圖定製消息轉換器有這種效果。唉,代碼已經建立在許多依賴於此的地方,所以改變它會有點痛苦,但總體來說是正確的。 –