@JsonSerializer не работает после перехода с v1 Jackson на 2.4.4, как будто его игнорируют

Я работаю на JBoss 6.1.4 и использовал Jackson V1. После изменения моих зависимостей на эталонную версию 2.4.4 (и изменения всех включений на версии fastxml) похоже, что @JsonSerialize игнорируется. Вместо String (из сериализатора) он возвращает класс как JSON, который должен был быть сериализован. Ведение журнала и System.out внутри сериализатора не отображаются.

Я не вносил никаких изменений в код, кроме изменения включений для использования fastxml.

public class HiDateSerializer extends JsonSerializer<HiDate> {

    @Override
    public void serialize(final HiDate value, final JsonGenerator gen, final SerializerProvider sp) throws IOException, JsonProcessingException {
        if (value == null || value.isNull()) {
            gen.writeString("");
        } else {
            gen.writeString(value.fmt());
        }
     }
 }

Затем в моем классе модели я использую аннотацию для всех атрибутов HiDate:

@JsonSerialize(using = HiDateSerializer.class)
private HiDate dob;

Вот моя зависимость:

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson.version}</version>
    </dependency>

Раньше я получал либо пустую строку, либо строку только с датой. Однако теперь я получаю представление JSON всего класса HiDate. Как будто @JsonSerialize больше не соблюдается.


person Jay Witherspoon    schedule 15.02.2019    source источник
comment
Вы меняли пакеты с org.codehaus.*?   -  person Michał Ziober    schedule 16.02.2019
comment
Благодарю. Я изменил весь импорт из codehaus на fastxml (это было забавно) и фактически удалил зависимость от codehaus. Я проверил, что в ухе есть только банки fastxml.   -  person Jay Witherspoon    schedule 16.02.2019
comment
Я не уверен, потому что не могу это проверить, но похоже, что у вас проблема с загрузчиком классов. JBoss возможно все еще использует реализацию codehaus, которая включена в установку JBoss. Ваше веб-приложение, вероятно, по умолчанию использует codehause маппер, и вам нужно определить и зарегистрировать маппер из fasterxml в вашем приложении вручную.   -  person Michał Ziober    schedule 16.02.2019
comment
Проблема с загрузчиком классов имеет смысл, но похоже, что вы не описываете изменение пути к классам, а программно определяете и регистрируете сопоставитель, так что он в основном игнорирует путь?   -  person Jay Witherspoon    schedule 17.02.2019
comment
Точно. В вашем приложении вам нужно определить ObjectMapper из fasterxml, и это должно решить проблему.   -  person Michał Ziober    schedule 17.02.2019
comment
Я прочитал много примеров использования ObjectMapper, и либо я неправильно понимаю, либо это не даст ожидаемых результатов. Раньше @JsonSerialize преобразовывался в строку под прикрытием, и в классе все еще был HiDate. Либо я этого не понимаю, либо использование ObjectMapper заставило бы меня изменить класс и заменить HiDate типом String. В моем примере выше, где будет выполняться регистрация ObjectMapper?   -  person Jay Witherspoon    schedule 19.02.2019
comment
Вы используете JBOSS, поэтому ваше приложение, вероятно, является веб-приложением. Вы используете Spring или что-то еще?   -  person Michał Ziober    schedule 19.02.2019
comment
Да, это веб-приложение, и мы не используем Spring или какой-либо другой фреймворк.   -  person Jay Witherspoon    schedule 19.02.2019
comment
Но вам нужно как-то обрабатывать запрос. Что вы используете для обработки HTTPRequest и обслуживания страниц?   -  person Michał Ziober    schedule 19.02.2019
comment
Служба отдыха, работающая на JBoss EAP с использованием сеансовых компонентов без сохранения состояния.   -  person Jay Witherspoon    schedule 19.02.2019
comment
Я обнаружил, что, хотя банки Джексона находятся в моем файле уха, они не используются после его установки... По умолчанию JBoss использует свои собственные классы json и игнорирует те, что в ухе. Это точно не помогает! Изучаю, как исключить банки JBoss и использовать то, что у меня в ухе...   -  person Jay Witherspoon    schedule 21.02.2019
comment
Я написал это в своем втором комментарии: JBoss, вероятно, все еще использует реализацию codehaus, которая включена в установку JBoss. Вы смотрели URL-адреса в моем ответе?   -  person Michał Ziober    schedule 21.02.2019


Ответы (1)


Я думаю, вы используете по умолчанию ResteasyJacksonProvider, который загружает классы из org.codehaus.*. Вам необходимо зарегистрироваться ResteasyJackson2Provider, который использует классы из com.fasterxml.jackson.* пакетов.

Смотрите также:

  1. аннотации jackson jboss eap6.1.1 не работают
  2. Глава 21. Поддержка JSON через Jackson< /а>
  3. JBoss resteasy — пользовательский поставщик Джексона
  4. Использование resteasy-jackson2-provider вместо resteasy-jackson-provider
  5. jackson-jaxrs-providers
person Michał Ziober    schedule 19.02.2019
comment
Спасибо вам за ссылки. Обнаружение того, что он не использует мои банки, было большой помощью. Я обновил свой resteasy на сервере до последней версии 3.6.3.Final и включил этот же уровень в свое приложение, поэтому я считаю, что версии должны совпадать. Я также включаю в свое приложение resteasy вместо jackson. Так что весь код должен быть одинаковым. Теперь он иногда работает, что действительно странно. Я использую один и тот же @JsonSerialize(using = HiDateSerializer.class) для всех классов. Раньше я всегда получал объект вместо строки. Я пытаюсь определить для отказа. - person Jay Witherspoon; 22.02.2019
comment
@JayWitherspoon, иногда это работает? Это странно! Вы уверены, что ваш Jackson2Provider используется во всех случаях? Может быть, в запросе неправильный заголовок или что-то в этом роде? Если можно, дополните вопрос новыми данными. Может быть, мы могли бы вам как-то помочь. В случае, если это будет вопрос другого типа, вы всегда можете создать новый вопрос и описать проблему. Оригинальный вопрос наверное уже устарел. - person Michał Ziober; 22.02.2019