2011-07-07 10 views
3

私はResteasyを使ってJSONとXMLの両方を返すアプリを書いていますが、選択肢はXMLになります。ここに私の方法があります:Resteasy Content-Type defaults

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

私が持っている問題は、2つのコンテンツタイプを返しているということです。

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

どのように私は2番目のContent-Typeを設定することからRESTEasyのを停止、または存在しません同じ@Pathではなく、異なる@Producesアノテーションを持つ2つの別々の関数を持たなくても、これを行うより良い方法はありますか?

もう1つの選択肢は、response.setContentTypeを気にせず、@Produces({MediaType.APPLICATION_XML、MediaType.APPLICATION_JSON})を持ち、Resteasyが処理するようにすることですが、返される一致するメディアタイプを検出するにはどうすればよいですか?私はHttpHeadersオブジェクトを取得してgetAcceptableMediaTypes()を呼び出すことができますが、これは私がresteasyがすでに行っているAcceptヘッダーを効果的に再解釈しなければならないことを意味します。確かに、複数の@Producesパラメータを提供するときに、返されたMediaTypeを再取得する方法が必要ですか?

+0

私ができることは、レスポンスオブジェクトを気にせず、@Produces(MediaType.APPLICATION_XML、MediaType.APPLICATION_JSON)を持っていることです。 – agentgonzo

答えて

3

http://wikis.sun.com/display/Jersey/Overview+of+JAX-RS+1.0+Featuresの@Producesセクションを読むと、この仕様では、アプリケーションがHTTP Acceptヘッダーと一致するコンテンツタイプを選択することが必要になると思われます。 @Producesアノテーションのコンテンツタイプがすべて一致する場合は、最初のアノテーションのみを使用する必要があります。

私は2つの事のうちの1つを考えています。 Resteasyが仕様を適切に実装していない可能性があります。 @Produces注釈と.setContentTypeコールがうまく再生されない可能性もあります。私はJAX-RSマスターではありませんが、Producesアノテーションはそこにあり、Responseオブジェクトと直接対話する必要はありません。

+0

ああ、私が完全に@Produces行を取り除く。 :-( – agentgonzo

+0

あなたの関数がStringを返す場合は、Responseオブジェクトを使って何をしていますか?レスポンスオブジェクトに含まれる文字列を返すだけで、どこでもcontenttypeを指定しないと、私は文字列を返し、@Produces行を使うか、@Produces行を使わずにレスポンスを返そうとします。 – Jon7

関連する問題