2016-12-05 6 views
3

У меня есть метод контроллера пружины, который принимает String как целиком из RequestBody как так:Джексон + Spring Web не в состоянии десериализации в кавычках строки после изменения Message-преобразователей

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

Раньше я был в состоянии пост "голые" строки к этому методу, то есть запросы со строкой как тело (а не объект json). Например (из хрома Девых инструментов):

Initial post attempt

Это перестал работать после того, как я попытался добавить Jackson Hibernate 4 module к Jackson2ObjectMapperFactoryBean (иметь дело с Hibernate ленивых коллекциями), используя следующий в моем файле конфигурации 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] 

Произведением Arround для этого (с использованием угловых JS) является вызовом JSON.stringify() перед отправкой к API, так что угловой код становится

$http.post(Url + userId, JSON.stringify(string)).then(function (result) { 
     return result.data; 
    }); 

и запрос становится

With quotes

После этого API работает так же, как и раньше, принимая String самостоятельно.

Хотя я знаю, что строка без включения " не является допустимой строкой JSON, я не понимаю, почему изменение компонента ObjectMapper должно иметь такое значение в этом случае? Я использую весеннюю версию 4.3.4 и версию Jackson 2.8.5, если это вообще полезная информация.

ответ

0

Какова была конфигурация вашего диспетчера сервлетов и конфигурация зависимостей, прежде чем вводить пользовательский MappingJackson2HttpMessageConverter?

Поскольку Spring использует заголовок Content-type вашего запроса, чтобы определить, какой конвертер сообщений использовать, почему вы явно отправляете application/json, когда ваш запрос тела явно не JSON?

Надлежащий «обходной путь» должен был бы отправить Content-type: text/plain, что сделало бы Spring использовать StringHttpMessageConverter который также является то, что я считаю, Spring сделал, прежде чем начал конфигурировании MappingJackson2HttpMessageConverter

+0

грузоотправитель сервлет выглядел как [это] (HTTP://pastie.org/private/s5e1lpwrvfluoeyuj1nifa). В моем контексте приложения нет никакого отношения к jackson: я думаю, что это просто использование весенних дефолтов. Я считаю, что даже добавить тег '' достаточно, чтобы вызвать это поведение. Я рассмотрю использование «Content-type: text/plain», но я просто удивлен, что попытка настроить конвертеры сообщений имеет этот эффект. Увы, код был построен в ряде мест, полагаясь на это, поэтому его изменение будет немного болезненным, но правильным решением в целом. –