JAX-RS 提供了一种在 @Produces
中指定内容类型的绝妙方法。 ,并且框架会自动从客户端的 HTTP Accept
中确定最佳内容类型 header 和奇迹的奇迹,甚至在向调用者返回信息时将您的对象转换为该类型(例如,使用 JAXB 的 XML 或使用 Jackson 的 JSON)。
我的(工作)客户端,就像客户经常做的那样,通过请求我通过 URL 中的扩展名指定内容类型,使简单的工作变得更加困难,例如api/widgets.json
.这将迫使我拥有各种 getWidgetsXXX()
方法,一种是 @Produces("application/json")
,另一个与 @Produces("application/xml")
, 等等。
但是我正在使用 Apache CXF,我很高兴地发现我可以 configure CXF使用 jaxrs.extensions
将各种扩展映射到内容类型初始化参数!
<!-- 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 扩展内容类型映射?
附言我没有使用 Spring。
最佳答案
在您的 <jaxrs:server>
中添加以下内容作品:
<jaxrs:extensionMappings>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</jaxrs:extensionMappings>
来源:http://cxf.apache.org/docs/jax-rs.html#JAX-RS-Debugging
关于在 Apache CXF JAX-RS 中映射扩展内容类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10000699/