JAX-RS は、 でコンテンツ タイプを指定する素晴らしい方法を提供します@Produces
。フレームワークは、クライアントの HTTP ヘッダーから最適なコンテンツ タイプを自動的に決定し、Accept
驚くべきことに、オブジェクトをそのタイプに変換します (たとえば、JAXB を使用する XML または Jackson を使用する JSON)。 ) 呼び出し元に情報を返すとき。
私の(仕事の)クライアントは、クライアントがよくするように、URL の拡張子でコンテンツ タイプを指定するように要求することで、単純な仕事をより困難にしましたapi/widgets.json
。これにより、 を使用したもの、 を使用したものなど、さまざまなgetWidgetsXXX()
方法が必要になります。@Produces("application/json")
@Produces("application/xml")
しかし、私は Apache CXF を使用しており、CXF を構成jaxrs.extensions
して、 init パラメータを使用してさまざまな拡張機能をコンテンツ タイプにマップできることを発見してうれしく思いました。
<!-- registers extension mappings -->
<init-param>
<param-name>jaxrs.extensions</param-name>
<param-value>
xml=application/xml
json=application/json
</param-value>
</init-param>
しかし、これが現実の世界でどのように機能するかについてのドキュメントはまったく見つかりません。メソッドに拡張子付きのパスで注釈を付けるだけで、Accepts
ヘッダーを模倣できると単純に考えました。
@Path("/widgets.{extension}")
@GET
@Produces({ "application/json", "application/xml" })
public List<Widget> getWidgets();
を使用して呼び出すとapi/widgets.json
、XML が返されます。JAX-RS では、デフォルトのコンテンツ タイプがリストの最初にあると指定されているため、これは特に奇妙です。
CXF 拡張コンテンツ タイプ マッピングの使用方法はどこで確認できますか?
PS私はSpringを使用していません。