【问题标题】:Rest JAX-RS exception, MessageBodyWriter not foundRest JAX-RS 异常,未找到 MessageBodyWriter
【发布时间】:2014-12-26 21:18:35
【问题描述】:

我正在使用 Jersey 2.13

当我尝试通过浏览器中的 url 访问资源时,出现 MessageBoddyWriter not found 异常。

例外:

MessageBodyWriter not found for media type=application/json, 
type=class java.util.ArrayList, genericType=java.util.List<com.webservices.entity.Book>.

我有另一种产生“APPLICATION_XML”的方法,而且似乎工作正常。

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Book { 
    @XmlElement
    private String name;    
    @XmlElement
    private String author;
    //getters setters
}

@GET
@Path("/json")
@Produces(MediaType.APPLICATION_JSON)
public List<Book> getJsonResponse(JAXBElement<Book> book){
    return new ArrayList<Book>();
}

我的想法是 jersey 会自动找到 "JacksonJsonProvider",这是一个由 Jackson 提供的消息编写器类,但它没有。

我的 lib 文件夹:

【问题讨论】:

    标签: java web-services rest exception jersey


    【解决方案1】:

    根据 mkyong jersey+jackson 教程,您需要在 web.xml 中添加 com.sun.jersey.api.json.POJOMappingFeature 参数以集成它们

    <servlet>
        <servlet-name>jersey-serlvet</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>com.mkyong.rest</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
     </servlet>
    

    【讨论】:

    【解决方案2】:

    从 Jersey 2.9 开始,转换器类的自动发现功能已被禁用。您必须手动向 Jersey 注册 JSON 库的转换器类。这是我所做的(我正在使用 Genson):

    @ApplicationPath( "/api/library" )
    public class RestService extends Application {
       @Override
       public Set<Class<?>> getClasses( ) {
          final Set<Class<?>> returnValue = new HashSet<Class<?>>( );
          returnValue.add( GensonJsonConverter.class );
          return returnValue;
       }
    }
    

    【讨论】:

      【解决方案3】:

      如果您想让您的应用程序代码同时支持 xml 和 json,您需要创建一个包装器对象来支持集合,而不是返回一个 GenericType。 PojoMappingFeature 将工作,因为它使用本机 Jackson ObjectMapper 而不是使用 jaxb 注释来编组对象。

      如果您希望它是可移植的,最好的解决方案是创建一个简单的包装对象。

      @XmlRootElement
      public class Books {
      
         private List<Book> books;
      
         public Books() {
         }
      
         public Books(List<Book> books) {
             this.books = books;
         }
      
         @XmlElement(name="book")
         public List<Book> getBooks() {
            return books;
         }
      
         public void setBooks(List<Book> books) {
            this.books = books;
         }
      }
      
      
      @GET
      @Path("/json")
      @Produces(MediaType.APPLICATION_JSON)
      public Books getJsonResponse(JAXBElement<Book> book){
          return new Books(new ArrayList<Book>());
      }
      

      如果您决定也支持 MediaType.APPLICATION_XML,那么这是必需的。这样也能解决json(jackson)问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-02
        • 2017-05-21
        • 1970-01-01
        • 2016-07-27
        • 1970-01-01
        • 1970-01-01
        • 2015-02-03
        相关资源
        最近更新 更多