Как я могу включить корпус Pascal по умолчанию при использовании Jackson JSON в Spring MVC?

У меня есть проект, который использует Spring MVC для создания и обработки нескольких конечных точек REST. В настоящее время я работаю над использованием Jackson для автоматической обработки сериализации/десериализации JSON с использованием аннотаций @RequestBody и @ResponseBody.

Я заставил Джексона работать, так что у меня есть отправная точка. Моя проблема в том, что наша старая сериализация выполнялась вручную и использовала корпус Pascal вместо корпуса Camel ("MyVariable" вместо "myVariable"), а Джексон использует корпус Camel по умолчанию.

Я знаю, что могу вручную изменить имя переменной, используя @JsonProperty. При этом я не считаю добавление @JsonProperty ко всем моим переменным жизнеспособным долгосрочным решением.

Есть ли способ заставить Джексона использовать регистр Pascal при сериализации и десериализации, кроме использования аннотации @JsonProperty?

РЕДАКТИРОВАТЬ: Похоже, нет чистого способа сделать это извне. Несколько человек предложили переопределить разные классы как способ достижения моей цели. Я открыт для предложений о том, что я могу переопределить, что изменит корпус. На данный момент я сделал собственный ObjectMapper, который устанавливает некоторые свойства, которые я хочу (а именно Inclusion.NON_NULL). Я еще не нашел места, которое позволило бы мне изменить поведение корпуса. есть идеи?


person bhilstrom    schedule 12.01.2011    source источник
comment
Я так не думаю, Джексон всегда будет использовать имя в стиле Java.   -  person skaffman    schedule 12.01.2011
comment
Внезапно, можете ли вы расширить класс(ы) Джексона и таким образом изменить соглашение об именах?   -  person DwB    schedule 12.01.2011
comment
Для этого вы можете переопределить некоторые части (AnnotationIntrospector, BeanSerializerFactory). Но еще нет чистого внешнего способа добавления стратегий именования (который был запрошен несколькими пользователями).   -  person StaxMan    schedule 13.01.2011


Ответы (3)


См. http://www.cowtowncoder.com/blog/archives/2011/03/entry_448.html Если вы можете дождаться версии 1.8, она будет включена туда.

person ThuneGrill    schedule 16.03.2011

В итоге я решил проблему, переопределив (де)сериализаторы. Кому интересно, вот как это можно сделать своими руками:

Шаг 1. Расширьте BeanSerializerFactory.

Переопределите метод _constructWriter(SerializationConfig config, TypeBindings typeContext, PropertyBuilder pb, boolean staticTyping, String name, AnnotatedMember propertyMember). Внутри этого метода измените name любым удобным для вас способом. Чтобы реализовать корпус Pascal, я использовал эту строку: String formattedName = name.substring(0, 1).toUpperCase() + name.substring(1);. После изменения name вызовите super._constructWriter.

Шаг 2. Расширьте BeanDeserializationFactory.

Переопределите метод constructSettableProperty(DeserializationConfig config, BasicBeanDescription beanDesc, String name, AnnotatedMethod setter). Сделайте то же самое с параметром name, что вы сделали в своем пользовательском BeanSerializerFactory.

Шаг 3. Создайте файл ObjectMapper.

Установите фабрику сериализатора в качестве собственной фабрики сериализатора компонентов. Установите поставщика десериализатора (я использовал эту строку: objectMapper.setDeserializerProvider(new StdDeserializerProvider(new CustomJacksonBeanDeserializerFactory()))).

Вот и все. Созданный вами ObjectMapper будет использовать вашу новую схему именования при сериализации или десериализации JSON.

person bhilstrom    schedule 21.01.2011

Что бы это ни стоило, есть Jira issue для поддержки подключаемых стратегий; голосование за него может помочь убедить разработчиков добавить поддержку. Как я упоминал в комментарии, внутреннее поведение можно переопределить, но сделать это непросто.

person StaxMan    schedule 14.01.2011