2011-07-07 128 views
3

我正在編寫一個應用程序使用Resteasy可以返回JSON和XML,但在一個選擇將默認爲XML。這裏是我的方法:Resteasy內容類型默認值

@GET 
@Path("/content") 
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) 
public String contentListRequestXml(@Context HttpServletRequest req, 
    @Context HttpServletResponse response, @Context UriInfo info, @Context HttpHeaders h) { 
    response.setContentType(MediaType.APPLICATION_XML); 
    if(isXml)   
     return generateXML(); 
    else 
     return generateJSON(); 
} 

,我有是,它返回兩個內容類型的問題:

$ curl http://localhost:1234/content -i -H "Accept: application/json,application/xml" -I HTTP/1.1 200 OK 
Content-Type: application/xml 
Content-Type: application/json 
Content-Length: 0 
Server: Jetty(6.1.25) 

如何停止RestEasy的距離設置第二內容類型,還是有更好的方式來做到這一點,而不必在同一個@Path上有兩個獨立的函數,但有不同的@Produces註釋?

另一種選擇是不打擾response.setContentType並使@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})讓Resteasy處理它,但是如何檢測匹配的mediatype將被返回?我可以得到HttpHeaders對象並調用getAcceptableMediaTypes(),但這意味着我必須有效地重新解釋已經爲我完成的Accept頭。當你提供多個@Produces參數時,肯定有一種方法可以讓返回的MediaType不受干擾?

+0

我可以做的另一件事是不用打擾響應對象,只是有@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON}) – agentgonzo

回答

3

閱讀此頁面的@Produces部分http://wikis.sun.com/display/Jersey/Overview+of+JAX-RS+1.0+Features,看起來該規範希望應用程序選擇與HTTP Accept頭相匹配的任何內容類型。如果@Produces註釋中的所有內容類型都匹配,則應該只使用第一個。

所以我正在考慮兩件事之一。 Resteasy可能無法正確實施規範。也有可能@Produces註釋和.setContentType通話不會很好。我不是JAX-RS的主人,但我認爲Produces註釋在那裏,因此您不必直接與Response對象交互。

+0

哦,我還應該提到,如果我完全得到相同的結果擺脫@Produces線。 :-( – agentgonzo

+0

所以......如果你的函數返回一個字符串,你對Response對象做了什麼?如果你剛剛返回一個響應對象包含的字符串,並且你沒有在任何地方指定contenttype,resteasy可能只是正在複製http accept中的任何內容,我會嘗試返回一個字符串,並使用@Produces行或不使用@Produces行並返回Response。 – Jon7