Джерси / JAXB: демонтаж пустого массива json приводит к появлению списка с одним элементом, для которого все поля имеют нулевое значение - PullRequest
6 голосов
/ 17 июня 2010

У меня действительно простой веб-сервис отдыха, возвращающий список вопросов.Этот код работает, как и ожидалось, когда количество возвращаемых вопросов больше нуля.Но если сервер возвращает пустой массив json, такой как [], JAXB создает список с одним экземпляром вопроса, в котором все поля имеют нулевое значение!

Я новичок в Джерси и JAXB, поэтому я не знаю, правильно ли я его настроил или это известная проблема.Любые советы?

Конфигурация клиента:

 DefaultApacheHttpClientConfig config = new DefaultApacheHttpClientConfig();
 config.getProperties().put(DefaultApacheHttpClientConfig.PROPERTY_HANDLE_COOKIES, true);
 config.getClasses().add(JAXBContextResolver.class);
 //config.getClasses().add(JacksonJsonProvider.class); // <- Jackson causes other problems

 client = ApacheHttpClient.create(config);

JAXBContextResolver:

@Provider
 public final class JAXBContextResolver implements ContextResolver<JAXBContext> {

  private final JAXBContext context;
  private final Set<Class> types;
  private final Class[] cTypes = { Question.class };

  public JAXBContextResolver() throws Exception {
   this.types = new HashSet(Arrays.asList(cTypes));
   this.context = new JSONJAXBContext(JSONConfiguration.natural().build(), cTypes);
  }

  @Override
  public JAXBContext getContext(Class<?> objectType) {
   return (types.contains(objectType)) ? context : null;
  }

 }

Код клиента:

public List<Question> getQuestionsByGroupId(int id) {
    return digiRest.path("/questions/byGroupId/" + id).get(new GenericType<List<Question>>() {});
}

Класс вопроса - это простопростое pojo.

Ответы [ 2 ]

0 голосов
/ 07 августа 2012

Использование Джексон может помочь.См. org.codehaus.jackson.map.ObjectMapper и org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion.NON_EMPTY

import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.annotate.JsonSerialize;

public class SampleContextResolver implements ContextResolver<ObjectMapper>
{
        @Override
        public ObjectMapper getContext(Class<?> type)
        {
            ObjectMapper mapper = new ObjectMapper();

            mapper.setSerializationConfig(mapper.getSerializationConfig()
                .withSerializationInclusion(JsonSerialize.Inclusion.NON_EMPTY)
        }
}
0 голосов
/ 04 мая 2012

Я знаю, что это не совсем ответ на ваш вопрос, но я решил использовать GSON поверх майки, для моих текущих проектов.(и я стараюсь избегать JAXB, насколько это возможно), и я обнаружил, что это очень легко и просто.

Вам просто нужно объявить

@Consumes(MediaType.TEXT_PLAIN)

или

@Produces(MediaType.TEXT_PLAIN)

или оба, и используйте маршаллер / демаршаллер GSON, и работайте с простыми строками.Очень легко отлаживать, тоже юнит-тест ...

...