RestEasy + JacksonJaxbJsonProvider настройка включения + аннотации

1

Я пытаюсь настроить jackson-module-jaxb-annotations-2.2.1 в RestEasy для вывода пустых массивов в Json.

Я делаю их со следующим кодом:

@Provider
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class JacksonIncludeNullJsonProvider extends JacksonJaxbJsonProvider
{
    public JacksonIncludeNullJsonProvider() {
        ObjectMapper mapper =  new ObjectMapper();

        configure(SerializationFeature.WRITE_EMPTY_JSON_ARRAYS, true);
        mapper.getSerializationConfig().withSerializationInclusion(JsonInclude.Include.ALWAYS);

        super.setMapper(mapper);
    }
}

Но когда я компилирую проект с этим классом, все аннотации JAXB перестают работать.

Насколько я понимаю, когда я регистрирую картупер в своем собственном провайдере, он освобождает все настройки по умолчанию от JacksonJaxbJsonProvider. Какая конфигурация должна быть включена в аннотации JAXB + включение пустой массивы?

Теги:
jaxb
jackson

1 ответ

0
Лучший ответ

Объект mapper, созданный в конструкторе в вашем примере, не настроен для поддержки аннотаций JAXB по умолчанию. Вы должны либо повторно использовать внутренний картограф, предоставленный суперклассом JacksonJaxJsonProvider, либо настроить свой картограф для поддержки аннотаций JAXB. Вот ссылка на wiki Jackson JAX-RS.

Ниже приведен пример, основанный на вопросе подкласса JacksonJaxJsonProvider, который настраивает внутренний конструктор объектов в конструкторе (хотя это не очень элегантное решение).

Обратите внимание, что я инвертировал параметры сериализации из исходного вопроса, так как они не меняют значения по умолчанию, чтобы показать разницу в результатах от разных поставщиков.

public class JacksonProvider {
    public static class JacksonIncludeNullJsonProvider extends JacksonJaxbJsonProvider
    {
        public JacksonIncludeNullJsonProvider() {
            // must be the first call to initialize the mapper
            configure(SerializationFeature.WRITE_EMPTY_JSON_ARRAYS, false);
            _mapperConfig.getConfiguredMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
        }

    }

    public static class Bean {
        @XmlElement(name = "xmlField1")
        public final String field1;
        public final String field2;
        public final String field3 = null;
        public final Map<String, Object> field4 = Collections.emptyMap();

        public Bean(String field1, String field2) {
            this.field1 = field1;
            this.field2 = field2;
        }
    }

    public static void main(String[] args) throws IOException {
        JacksonIncludeNullJsonProvider provider = new JacksonIncludeNullJsonProvider();
        JacksonJaxbJsonProvider provider2 = new JacksonJaxbJsonProvider();
        Bean bean = new Bean("a", "b");
        provider.writeTo(bean, Bean.class, null, null, MediaType.APPLICATION_JSON_TYPE, null, System.out);
        System.out.println();
        provider2.writeTo(bean, Bean.class, null, null, MediaType.APPLICATION_JSON_TYPE, null, System.out);
    }
}

Вывод:

{"xmlField1":"a","field2":"b"}
{"xmlField1":"a","field2":"b","field3":null,"field4":{}}   
  • 0
    Спасибо, но какой конфиг должен быть для вывода пустых массивов в Java как массивов JSON? public final List<Object> field4 = null; должен интерпретироваться в: "field4":[] Когда я создаю новый ненастроенный преобразователь, как в первом сообщении mys, я получаю этот результат, но не с использованием существующего преобразователя.
  • 0
    Вы хотите вывести пустой массив, если поле пустое, не так ли?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню