【问题标题】:Correct JAX-RS media type matching for JSON provider为 JSON 提供程序正确匹配 JAX-RS 媒体类型
【发布时间】:2016-11-24 17:54:02
【问题描述】:

官方的 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 媒体类型模式匹配对媒体类型子组件语义有所了解。

【问题讨论】:

  • 我在JAX-RS spec 中找不到任何东西(子类型是具体或通配符,没有组合),MediaType#isCompatible 无法处理。 application/*+json似乎是错误的或RestEasy的供应商功能。
  • 是的,这就是resteasy。并且“application/json”匹配“application/*+json”。见MediaTypeMap.SubTypeMap.getPossible
  • 但它是 JAX-RS 的标准部分吗?我希望这可以与其他 JAX-RS 实现一起使用吗?请提供单独的答案,以便在您提供参考时我可以将其标记为正确。谢谢。

标签: json jax-rs resteasy jackson2


【解决方案1】:

JAX-RS 规范中没有关于媒体类型后缀的内容。每个提供者都可以随意处理后缀。

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

  • 球衣(带有 Jettison JSON 提供程序)- 不处理服务产生 application/json 媒体类型
  • RESTeasy(内部 JSON 提供程序)- 处理服务产生 application/json媒体类型
  • Apache CFX(内部 JSON 提供程序)- 进程服务产生 application/json 媒体类型(如果 PARTIAL_HIERARCHICAL_MEDIA_SUBTYPE_CHECK 属性为 true)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多