Использование провайдеров по умолчанию / MessageBodyWriters в Джерси 2

Просто начиная с Джерси, я пытался воспроизвести простой пример из последней документации Джерси « Построение ответов ». Эта часть, насколько я понимаю, должна показать, как Response и ResponseBuilder можно использовать для простого возврата ответа в сочетании с Entity для содержания ответа.

Теперь в документации говорится, что по умолчанию поддерживаются несколько типов данных (здесь: « Представления и типы Java »). String простые среди них, соответствующие любому типу медиа.

Из всех вариантов, которые я пробовал, следующее является самым простым:

@POST
public Response post() {
    URI createdUri;
    try {
        createdUri = new URI("http://test.lan");
    } catch (final URISyntaxException e) {
        throw new WebApplicationException(e);
    }

    return Response.created(createdUri).entity(Entity.text("someContent")).build();
}

Я всегда получал одну и ту же ошибку (полная трассировка стека ниже) при вызове запроса: org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=text/plain, type=class javax.ws.rs.client.Entity, genericType=class javax.ws.rs.client.Entity.

Я полагаю, это говорит о том, что подходящего поставщика не найдено для этого универсального типа сущности. Тем не менее, String должен поддерживаться OOTB?

Я обнаружил, что StringMessageProvider, вероятно, является реализацией этого провайдера на Джерси 1, и наиболее близкие родственные классы, которые я нашел в моих библиотеках на Джерси 2, являются классами в org.glassfish.jersey.message.internal в Джерси-общий. Среди многих провайдеров есть StringMessageProvider, который кажется мне потенциальным предполагаемым провайдером для этого.

Я посмотрел на проблему, и хотя есть много людей, которые получают это при неправильной попытке использовать пользовательский поставщик, я ничего не нашел о неработающих OOTB-провайдерах по умолчанию ..

Я проверил свои библиотеки, и сейчас у меня есть следующие зависимости в моем pom (среди прочих):

  • jersey-container-servlet-core
  • jersey- client
  • jersey-common
  • jersey-server

Я посмотрел онлайн, но это все, что мне нужно, хотя я с уверенностью не нашел правильные классы провайдеров для String и JAXB / JSON в банках.

Context

  • Проект Maven
  • с tomcat servlet-api 6.0.29
  • Версия 2.6 всех упомянутых библиотек джерси
  • Eclipse kepler
  • Использование плагина tomcat6 maven для запуска встроенного tomcat (до сих пор работает нормально)

Запрос Fiddler для тестирования

POST HTTP/1.1
User-Agent: Fiddler
Host: 127.0.0.1
Content-Length: 0

И снова попробовал несколько вариантов.

Полная трассировка стека

06-Jan-2015 21:13:54 org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor aroundWriteTo
SEVERE: MessageBodyWriter not found for media type=text/plain, type=class javax.ws.rs.client.Entity, genericType=class javax.ws.rs.client.Entity.
06-Jan-2015 21:13:54 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet TestService threw exception
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=text/plain, type=class javax.ws.rs.client.Entity, genericType=class javax.ws.rs.client.Entity.
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:247)
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
    at org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(JsonWithPaddingInterceptor.java:103)
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
    at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:88)
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
    at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1154)
    at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:571)
    at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:378)
    at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:368)
    at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:262)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:319)
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:236)
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1028)
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:373)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:219)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:662)

РЕДАКТИРОВАТЬ

Та же ошибка (для application / json) происходит теперь, когда я аннотировал класс с помощью @XmlRootElement и пытаюсь вернуть его в метод в соответствии с документами Джерси:

@GET
@Produces(MediaType.APPLICATION_JSON) 
public Foo sampleFoo() {
    Foo foo = new Foo();

    return foo;
}

где Foo помечено @XmlRootElement.

Я также добавил jersey-media-json-jackson в качестве зависимости, которая, как я вижу, содержит явного поставщика JSONJaxb. Тем не менее, это, похоже, не подобрано.

9
задан Mark Tielemans 8 January 2015 в 23:52
поделиться