【问题标题】:Getting exception while using JAX-RS response class to return the entity使用 JAX-RS 响应类返回实体时出现异常
【发布时间】:2017-04-02 16:27:00
【问题描述】:

当我使用下面的代码时,我得到了异常。它看起来是 jar 问题,为了符合它,我取消了注释代码的注释,它工作正常。

Message 类使用@XmlRootElement 进行注释,因此这也不应该成为问题。

出现异常 - org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json, type=class java.util.ArrayList, genericType=class java.util.ArrayList。

@Path("/messages")
@Singleton
public class MessageResource {

MessageService service = new MessageService();

@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getMessages(@BeanParam MessageBean bean) {

    List<Message> messages;

    if (bean.getYear() > 0)
        messages = service.getMessagesForYearById(bean.getYear());
    messages = service.getMessages();

    return Response.ok().entity(messages).build();
}

// @GET
// @Produces(MediaType.APPLICATION_JSON)
// public List<Message> getMessages(@BeanParam MessageBean bean) {
//
// List<Message> messages;
//
// if (bean.getYear() > 0)
// messages = service.getMessagesForYearById(bean.getYear());
// messages = service.getMessages();
//
//
// return messages;
// }

}

 <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servletclass>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>testing.jaxrs.Messages</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/webapi/*</url-pattern>
    </servlet-mapping>

【问题讨论】:

  • 您是否将jersey-json 添加到您的依赖项中?请同时发布您的 web.xml。
  • 我在 pom.xml 中添加了 jersey-bom、jersey-container-servlet-core、jersey-media-moxy 作为依赖项。

标签: java tomcat jax-rs


【解决方案1】:
List<Message> messages 
Response.ok().entity(messages)

由于运行时类型擦除,这会导致 Collection 携带的类型丢失。用GenericEntity 包装集合以保留其类型信息:

GenericEntity generic = new GenericEntity<List<Message>>(messages){};
return Response.ok().entity(generic).build();

【讨论】:

  • 谢谢@grizzly。这很有效,因为我刚开始学习 JAX-RS,并且不了解 GenericEntity。让我进一步了解它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
相关资源
最近更新 更多