2016-12-05 68 views
3

我有一個彈簧控制器方法,這需要String爲一體的RequestBody像這樣整體後反序列化無引號字符串:傑克遜+ Spring的web無法修改消息變換器

@RequestMapping(method=RequestMethod.POST) 
    public @ResponseBody DTO method(@PathVariable("userId") long userId, @RequestBody String page) { 
     // Controller contents here 
    } 

以前,我已經能夠發佈「裸體」字符串到這個方法,這是請求與一個字符串作爲正文(而不是一個JSON對象)。例如(從Chrome瀏覽器開發工具):

Initial post attempt

這停止工作後,我試圖將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; 
    }); 

和請求變得

With quotes

此之後API的工作方式與之前一樣,只接受字符串。

雖然我知道一個沒有包含的字符串"不是一個有效的JSON字符串,但我不明白爲什麼在這種情況下更改ObjectMapper bean會產生這樣的差異?如果這是所有有用的信息,我正在使用spring 4.3.4版和jackson 2.8.5版。

回答

0

在引入自定義MappingJackson2HttpMessageConverter之前,您的調度程序servlet配置和依賴項配置是什麼樣的?

由於Spring使用請求頭Content-type來確定要使用哪個消息轉換器,當您的請求體明顯不是JSON時,爲什麼要明確發送application/json

一個適當的「解決辦法」將發送Content-type: text/plain,這將使使用Spring的StringHttpMessageConverter這也是我所相信的春天做你開始配置MappingJackson2HttpMessageConverter

+0

調度servlet的樣子[這](HTTP前:/ /pastie.org/private/s5e1lpwrvfluoeyuj1nifa)。在我的應用程序上下文中與jackson沒有任何關係:我認爲這只是使用spring的默認設置。我發現即使添加'標籤也足以觸發這種行爲。我將研究使用'Content-type:text/plain',但我很驚訝試圖定製消息轉換器有這種效果。唉,代碼已經建立在許多依賴於此的地方,所以改變它會有點痛苦,但總體來說是正確的。 –