为JSON提供程序正确匹配JAX-RS媒体类型

3
官方的JSON媒体类型是application/json。Jackson的RESTEasy提供程序ResteasyJackson2Provider指定媒体类型如下:
@Provider
@Consumes({"application/*+json", "text/json"})
@Produces({"application/*+json", "text/json"})
public class ResteasyJackson2Provider extends JacksonJaxbJsonProvider

我不明白。我知道"application/*+json"可以匹配application/foo+json,但是它是否也能匹配没有加号+application/json呢?这是JAX-RS规范中规定的吗?除非JAX-RS媒体类型模式匹配具有对媒体类型子组件语义的理解,否则它并不符合通配符的预期工作方式。


1
我在JAX-RS规范中找不到任何内容(子类型只能是具体类型或通配符,不能组合),而MediaType#isCompatible无法处理它。application/*+json似乎是错误的,或者是RestEasy的一项供应商功能。 - dur
1
是的,这是关于resteasy的特定内容。而且"application/json"匹配"application/*+json"。请参见MediaTypeMap.SubTypeMap.getPossible - CyberWasp
1
但这是JAX-RS的标准部分吗?我是否可以期望它能在其他JAX-RS实现中工作?请提供一个单独的答案,以便我可以将其标记为正确,并附上参考资料。谢谢。 - Garret Wilson
1个回答

1

JAX-RS规范中没有关于媒体类型后缀的内容。每个提供者根据自己的喜好处理后缀。

我用三个JAX-RS实现测试了我的自定义提供者(生成application/*+json媒体类型):

  • Jersey(使用Jettison JSON提供者)- 不处理服务生成的application/json媒体类型
  • RESTeasy(内部JSON提供者)- 处理服务生成的application/json媒体类型
  • Apache CFX(内部JSON提供者)- 处理服务生成的application/json媒体类型(如果PARTIAL_HIERARCHICAL_MEDIA_SUBTYPE_CHECK属性为true

我的建议是,如果您想使用不同的JAX-RS实现,请不要信任*+json媒体类型。请添加明确的application/json


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接