簡體   English   中英

其余的JAX-RS異常,找不到MessageBodyWriter

[英]Rest JAX-RS exception, MessageBodyWriter not found

我正在使用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>.

我還有另一種產生“ 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>();
}

我的想法是,球衣會自動找到由Jackson提供的消息"JacksonJsonProvider""JacksonJsonProvider" ,但沒有。

我的lib文件夾:

在此處輸入圖片說明

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

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

如果要使應用程序代碼同時支持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)問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM