【发布时间】:2012-04-03 20:15:40
【问题描述】:
JAX-RS 提供了一种在 @Produces 中指定内容类型的绝妙方法,并且框架会自动从客户端的 HTTP Accept 标头中确定最佳内容类型,并且,奇迹般的,甚至将您的对象转换为该类型(例如,使用 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。
【问题讨论】:
标签: mapping cxf content-type jax-rs