Настройка десериализатора типа по умолчанию на уровне Mapper/Package/Class в Джексоне 2x

Если вам нужно несколько десериализаторов для типа (упакованных в один или несколько модулей), как Джексон определяет, какой основной десериализатор для этого типа? Это случайно? Если нет, можно ли по умолчанию установить пакет / класс?

Очевидно, было бы совершенно безумным, чтобы указать @JsonDeserialize(using=CustomDeserializer.class) почти для каждого отдельного свойства с заданным типом для каждого класса Джексона - так что я предполагаю, что есть метод установки значений по умолчанию, когда существует несколько десериализаторов, но пока ничего не найдено.

1 ответ

Хорошо, я вернулся и посмотрел, как я делал это в прошлом. Я снова использовал Spring. В моем случае я хотел обрезать начальные и конечные пробелы из всех моих входов. Вот как я это сделал.

В весеннем конфиге xml у меня есть

<!-- Configures the @Controller model -->
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager">
  <mvc:message-converters>
    <bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
      <property name="prefixJson" value="false"/>
      <property name="supportedMediaTypes" value="application/json"/>
      <property name="objectMapper" ref="customObjectMapper"></property>
    </bean>
  </mvc:message-converters>
</mvc:annotation-driven>
<bean id="customObjectMapper" class="com.domain.json.CustomObjectMapper"/>

Вот класс CustomObjectMapper

public class CustomObjectMapper extends ObjectMapper
{
    private static final long serialVersionUID = 1L;

    public CustomObjectMapper()
    {
        registerModule(new StringMapperModule());
    }
}

И, наконец, класс StringMapperModule

public class StringMapperModule extends SimpleModule
{
    private static final long serialVersionUID = 1L;

    /**
     * Modify json data globally
     */
    public StringMapperModule()
    {
         super();

        addDeserializer(String.class, new StdScalarDeserializer<String>(String.class)
        {
            private static final long serialVersionUID = 1L;

            @Override
            public String deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException
            {
                // remove leading and trailing whitespace
                return StringUtils.trim(jp.getValueAsString());
            }
        });
    }
}

Я надеюсь, что вы найдете это полезным или что оно, по крайней мере, указывает вам правильное направление.

Другие вопросы по тегам