Unmarshal JAXB-аннотированные классы от JSON с использованием Джерси и Джексона - PullRequest
1 голос
/ 02 ноября 2011

У меня есть класс, который имеет JAXB и аннотации проверки bean-компонентов, очень похожие на следующие:

@XmlType(namespace = "urn:com:company:assessment")
@XmlRootElement
public class Assessment
{
    // ...

    @NotNull
    @Size(min = 1,
          message = "Assessment requires at least one address.")
    @Valid
    @XmlJavaTypeAdapter(AddressesAdapter.class)
    public synchronized Set<Address> getAddresses()
    {
        return this.addresses;
    }

    // ...
}

Джерси выполняет маршалинг этого класса и демаршалирование из XML просто отлично; Тем не менее, Джерси не может правильно отменить сортировку из JSON. Я установил точки останова в классе AddressesAdapter и заметил, что метод unmarshal() никогда не вызывается при десериализации JSON.

Несмотря на то, что при настройке Джерси с использованием естественной нотации или иным образом, если я создаю @XmlAnyElement -аннотированное свойство, я получаю addresses элементов, которые должны были быть распакованы с помощью адаптера.

Если я использую Джексона напрямую и регистрирую его JacksonJaxbJsonProvider провайдера, я получаю исключения при попытке демонтажа из JSON:

Nov 2, 2011 10:07:41 AM com.sun.jersey.api.client.ClientResponse getEntity
SEVERE: A message body reader for Java class com.company.Assessment, and Java type class com.company.Assessment, and MIME media type application/json was not found
Nov 2, 2011 10:07:41 AM com.sun.jersey.api.client.ClientResponse getEntity
SEVERE: The registered message body readers compatible with the MIME media type are:
*/* ->
  com.sun.jersey.core.impl.provider.entity.FormProvider
  com.sun.jersey.core.impl.provider.entity.StringProvider
  com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
  com.sun.jersey.core.impl.provider.entity.FileProvider
  com.sun.jersey.core.impl.provider.entity.InputStreamProvider
  com.sun.jersey.core.impl.provider.entity.DataSourceProvider
  com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
  com.sun.jersey.core.impl.provider.entity.ReaderProvider
  com.sun.jersey.core.impl.provider.entity.DocumentProvider
  com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader
  com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader
  com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader
  com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
  com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
  com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General
  com.sun.jersey.core.impl.provider.entity.EntityHolderReader

(JacksonJaxbJsonProvider не указан.)

Кто-нибудь имеет представление о том, как я могу упорядочить свои аннотированные JAXB классы как XML, так и JSON без необходимости создания MessageBodyReader s и MessageBodyWriter s?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 04 ноября 2011

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

Я создал небольшой клиент Джерси, который получает ресурс JSON с сервера Rails и разбирает его в POJO, но я не смогне заставить его работать вчера, но сегодня я добился успеха!

Во-первых, в документации по требованиям к Джерси отсутствует одна банка, банка совместимости с Jackson XML, а также документация сбивает с толку.Я написал небольшой отчёт об этом http://java.net/jira/browse/JERSEY-803

Убедитесь, что у вас есть следующие jar-файлы при запуске вашей программы:

  • jackson-core-asl.jar
  • jackson-mapper-asl.jar
  • jackson-jaxrs.jar
  • jackson-xc.jar
  • jettison.jar
  • активации.jar
  • stax-api.jar
  • jersey-json.jar

Вам также потребуется поддержка JAXB 2.x, но это часть Java SE 6.

Дайте мне знать, если это работает для вас, если нет, я могу опубликовать свой код клиента JSON.

0 голосов
/ 02 ноября 2011

Добавьте jersey-json к зависимостям вашего проекта.

...