2014-05-26 2 views
1

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

я их на следующий код:

@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 + включение пустых массивов?

ответ

0

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

Ниже представлен пример на основе подкласса 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 массива? 'общественности окончательный список Field4 = NULL;' должны интерпретироваться в: '«Field4»: []' Когда я создаю новый ненастроенное картографа, как в Мысе первое сообщение, у меня есть этот результат, но не используя существующий картограф. –

+0

Вы хотите вывести пустой массив, если поле равно null, не так ли? –

+0

Да. И когда я создаю 'ObjectMapper mapper = new ObjectMapper()', он работает, поэтому я думаю, что это проблема конфигурации, при этом это можно сделать с помощью существующего адаптера JacksonJaxbJsonProvider. Но я понятия не имею, какие настройки нужно установить. –

Смежные вопросы