У меня есть метод контроллера пружины, который принимает String
как целиком из RequestBody
как так:Джексон + Spring Web не в состоянии десериализации в кавычках строки после изменения Message-преобразователей
@RequestMapping(method=RequestMethod.POST)
public @ResponseBody DTO method(@PathVariable("userId") long userId, @RequestBody String page) {
// Controller contents here
}
Раньше я был в состоянии пост "голые" строки к этому методу, то есть запросы со строкой как тело (а не объект json). Например (из хрома Девых инструментов):
Это перестал работать после того, как я попытался добавить 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;
});
и запрос становится
После этого API работает так же, как и раньше, принимая String самостоятельно.
Хотя я знаю, что строка без включения "
не является допустимой строкой JSON, я не понимаю, почему изменение компонента ObjectMapper должно иметь такое значение в этом случае? Я использую весеннюю версию 4.3.4 и версию Jackson 2.8.5, если это вообще полезная информация.
грузоотправитель сервлет выглядел как [это] (HTTP://pastie.org/private/s5e1lpwrvfluoeyuj1nifa). В моем контексте приложения нет никакого отношения к jackson: я думаю, что это просто использование весенних дефолтов. Я считаю, что даже добавить тег '' достаточно, чтобы вызвать это поведение. Я рассмотрю использование «Content-type: text/plain», но я просто удивлен, что попытка настроить конвертеры сообщений имеет этот эффект. Увы, код был построен в ряде мест, полагаясь на это, поэтому его изменение будет немного болезненным, но правильным решением в целом. –