Проблемы с обработкой JSON с использованием JAXBElement под Jersey 2.2 с MOXy

Я расширил код jersey-examples-moxy, чтобы использовать определение XML-схемы вместо аннотированных bean-компонентов JAXB. Скомпилированная xjc XML-схема создает кодировки XML и JSON, идентичные исходному примеру.

Я следовал инструкциям Джерси и использовал ObjectFactory для генерации представления объекта JAXBElement Customer в CustomerResource.java. Я также изменил клиент, как описано. Я также включил исправление, описанное в проблемах PUT с обработкой JSON с использованием JAXB под Jersey 2.2 с MOXy

MediaType.APPLICATION_XML отлично работает, а MediaType.APPLICATION_JSON работает для GET, но клиенту не удается маршалировать JSON на PUT с помощью "MessageBodyWriter not found". Выдается следующее исключение:

testJsonCustomer(org.glassfish.jersey.examples.jaxbmoxy.MoxyAppTest)  Time elapsed: 0.113 sec  <<< ERROR!
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json, type=class javax.xml.bind.JAXBElement, genericType=class javax.xml.bind.JAXBElement.
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:191)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:139)
at org.glassfish.jersey.filter.LoggingFilter.aroundWriteTo(LoggingFilter.java:268)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:139)
at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1005)
at org.glassfish.jersey.client.ClientRequest.writeEntity(ClientRequest.java:430)
at org.glassfish.jersey.client.HttpUrlConnector._apply(HttpUrlConnector.java:290)

Вот как я изменил CustomerResource.java:

private static ObjectFactory factory = new ObjectFactory();

@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public JAXBElement<Customer> getCustomer() {
    return factory.createCustomer(customer);
}

@PUT
@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public JAXBElement<Customer> setCustomer(Customer c) {
    customer = c;      
    return factory.createCustomer(customer);
}

Вот как я делаю запрос PUT (так же, как и для работающего XML):

@Override
protected void configureClient(ClientConfig clientConfig) {
    clientConfig.register(new MoxyXmlFeature());
}

@Test
public void testJsonCustomer() throws Exception {
    ObjectFactory factory = new ObjectFactory();
    final WebTarget webTarget = target().path("customer");

    // Target customer entity with GET and verify inital customer name.
    Customer customer = webTarget.request(MediaType.APPLICATION_JSON).get(Customer.class);
    assertEquals("Tom Dooley", customer.getPersonalInfo().getName());

    // Update customer name with PUT and verify operation successful.
    customer.getPersonalInfo().setName("Bobby Boogie");
    Response response = webTarget.request(MediaType.APPLICATION_JSON).put(Entity.json(factory.createCustomer(customer)));
    assertEquals(200, response.getStatus());

    // Target customer entity with GET and verify name updated.
    Customer updatedCustomer = webTarget.request(MediaType.APPLICATION_JSON).get(Customer.class);
    assertEquals(customer.getPersonalInfo().getName(), updatedCustomer.getPersonalInfo().getName());
}

Спасибо за помощь!

1 ответ

Решение

Проблема, с которой вы сталкиваетесь, находится в этой строке:

Response response = webTarget.request(MediaType.APPLICATION_JSON).put(Entity.json(factory.createCustomer(customer)));

В основном вы проходите JAXBElement в Entity#json метод, но среда выполнения не имеет информации об универсальном типе, вам нужно предоставить ее. Вот для чего предназначен класс GenericEntity ;:

webTarget
    .request(MediaType.APPLICATION_JSON)
    .put(Entity.json(new GenericEntity<JAXBElement<Customer>>(factory.createCustomer(customer)) {}));
Другие вопросы по тегам