2017-02-08 26 views
0

我正在寫一個列表博客響應爲我的REST全功能澤西島的Web應用程序。我怎樣才能用球衣製作RSS feed?我曾嘗試與澤西島產生響應RSS源(MessageBodyWriter未找到媒體類型=應用程序/ rss + xml)

@GET 
@Produces("application/rss+xml") 
public Response list() { 
    Map<Object, Object> apiResponse  = new HashMap<Object, Object>(); 
    Map<Object, Object> serviceResponse = new HashMap<Object, Object>(); 

    try { 
     List<Blog> blogs = blogService.list(); 
     serviceResponse.put("total", blogs.size()); 
     serviceResponse.put("list", blogs); 
     apiResponse.put("apiresponse", serviceResponse); 

     return Response.ok(apiResponse).build(); 

    } catch (Exception e) { 
     logger.error("Error in getting blog list:", e); 
     apiResponse.put("error", e.getMessage()); 
    } 

    return Response.status(500).entity(apiResponse).build(); 
} 

這是我的服務層的博客列表方法:

public List<Blog> list() throws Exception { 

     List<Blog> blogs= new ArrayList<Blog>(); 
     Query query = new Query(); 

     blogs= SpringDataDBUtils.getMongoOperations().find(query, Blog.class); 

     return blogs; 
    } 

但它不工作。它產生錯誤:

MessageBodyWriter not found for media type=application/rss+xml, type=class java.util.HashMap 

回答

0

澤西沒有提到它可以處理的HashMap轉換爲XML表示。

XML media types (text/xml, application/xml and application/...+xml)

  • javax.xml.transform.Source
  • javax.xml.bind.JAXBElement
  • Application supplied JAXB classes (types annotated with @XmlRootElement or @XmlType)

即使您在散列映射中使用的其他對象被註釋爲轉換爲XML,它也不起作用。

我建議你創建一個專用的表示對象,例如BlogListResponse,它用@XmlXXX註釋標註,你試圖使用的Blog實體也是如此。

0

如提到by @Frederik Heremans,問題出在(Hash)Map。但即使你使地圖工作,你仍然不會有一個有效的RSS格式。你只會隨機使用XML,這對於RSS閱讀器來說是不可能的。

如果你想要真正的RSS格式,你應該檢查出RSS Wikipedia page。你會看到不同的RSS版本和格式。之後,你應該找到一個專門處理RSS源的庫。我個人建議Rome。我認爲它是那裏最流行的Java庫。 (請務必查看鏈接,有很多例子)。

羅馬圖書館有一個模擬RSS提要(它支持多個RSS版本)的單根界面SyndFeed。通過該SyndFeed,您可以創建一個處理(反)序列化的JAX-RS Provider。這是一個完整的工作示例

import com.rometools.rome.feed.synd.SyndFeed; 
import com.rometools.rome.io.FeedException; 
import com.rometools.rome.io.SyndFeedInput; 
import com.rometools.rome.io.SyndFeedOutput; 

import javax.ws.rs.Consumes; 
import javax.ws.rs.InternalServerErrorException; 
import javax.ws.rs.Produces; 
import javax.ws.rs.WebApplicationException; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.MultivaluedMap; 
import javax.ws.rs.ext.MessageBodyReader; 
import javax.ws.rs.ext.MessageBodyWriter; 
import javax.ws.rs.ext.Provider; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.lang.annotation.Annotation; 
import java.lang.reflect.Type; 

/** 
* Example JAX-RS provider for Rome {@code SyndFeed}. 
*/ 
@Provider 
@Produces("application/rss+xml") 
@Consumes("application/rss+xml") 
public class SyndFeedProvider implements MessageBodyWriter<SyndFeed>, MessageBodyReader<SyndFeed> { 

    @Override 
    public boolean isWriteable(Class<?> type, Type genericType, 
           Annotation[] annotations,MediaType mediaType) { 
     return SyndFeed.class.isAssignableFrom(type); 
    } 

    @Override 
    public long getSize(SyndFeed syndFeed, Class<?> type, Type genericType, 
         Annotation[] annotations, MediaType mediaType) { 
     return -1; 
    } 

    @Override 
    public void writeTo(SyndFeed syndFeed, Class<?> type, Type genericType, 
         Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, 
         Object> httpHeaders, OutputStream entityStream) 
      throws IOException, WebApplicationException { 

     SyndFeedOutput output = new SyndFeedOutput(); 
     OutputStreamWriter writer = new OutputStreamWriter(entityStream); 
     try { 
      output.output(syndFeed, writer); 
     } catch (FeedException e) { 
      throw new InternalServerErrorException(e); 
     } 
    } 

    @Override 
    public boolean isReadable(Class<?> type, Type genericType, 
           Annotation[] annotations, MediaType mediaType) { 
     return SyndFeed.class.isAssignableFrom(type); 
    } 

    @Override 
    public SyndFeed readFrom(Class<SyndFeed> type, Type genericType, 
          Annotation[] annotations, MediaType mediaType, 
          MultivaluedMap<String, String> httpHeaders, 
          InputStream entityStream) throws IOException, WebApplicationException { 

     InputStreamReader reader = new InputStreamReader(entityStream); 
     SyndFeedInput input = new SyndFeedInput(); 

     try { 
      return input.build(reader); 
     } catch (FeedException e) { 
      throw new InternalServerErrorException(e); 
     } 
    } 
} 

您需要註冊此提供程序與應用程序新澤西州,無論是含蓄通過包掃描,或者明確地與ResourceConfig

該提供程序處理序列化和反序列化SyndFeed。因此,在您的資源中,您可以創建SyndFeed實例並將其作爲響應實體返回。提供者將處理序列化。示例提供程序還處理從序列化形式的反序列化到SyndFeed類,以防您想在客戶端上使用它,也許用於測試。

您可以在this Gist

中找到完整的工作測試用例
相關問題