休息JAX-RS异常,找不到MessageBodyWriter

时间:2014-10-30 17:32:57

标签: java web-services rest exception jersey

我正在使用Jersey 2.13

当我尝试通过浏览器中的URL访问资源时,我收到了MessageBoddyWriter异常。

例外:

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

我有另一种产生&#34; APPLICATION_XML&#34;这似乎工作正常。

@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>();
}

我的想法是,泽西岛会​​自动找到由杰克逊提供的消息作家班"JacksonJsonProvider",但事实并非如此。

我的lib文件夹:

enter image description here

3 个答案:

答案 0 :(得分:2)

根据mkyong jersey+jackson教程,您需要在web.xml中添加 com.sun.jersey.api.json.POJOMappingFeature param以进行集成

<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>

答案 1 :(得分:1)

从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;
   }
}

答案 2 :(得分:0)

如果要使应用程序代码同时支持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(杰克逊)问题。