【问题标题】:JAX-RS Support all media types using @consume annotationJAX-RS 支持使用 @consume 注解的所有媒体类型
【发布时间】:2016-02-26 09:34:17
【问题描述】:

由于功能要求,我正在开发一个 Web API,我想在其中添加对所有媒体类型的支持。我也尝试在类级别和方法级别提供@consumes("*/(")。但是当我尝试在Content-Type 标头中使用application/json 媒体类型访问我的api 时,它对我不起作用。

我查看了@consumes 注释的实现,其中它的默认值为*/*,所以我尝试将此注释用作@consumes,以便它可以添加默认值,但效果不佳. 暂时我用这个注释作为

@Consumes({"application/*","text/*"})

它允许客户端使用来自这些媒体类型组的所有可能的媒体类型访问我的 API。但是,如果客户端使用multipart/signed 或任何其他媒体类型发送请求,它仍然会搞砸。

【问题讨论】:

  • 说一个端点可以处理 any 类型,就是说您有一个配置为处理各种类型的提供程序。泽西岛不能这样做。它对 JSON、XML、multipart 等常见类型具有支持,但即使是那些(除了对 XML 的默认支持),它们仍然需要配置(通常通过添加支持库并注册它们)。最好的办法不支持任何类型,即*/*,并且只使用那些你知道你已经配置支持的类型。
  • 查看 chapter 8 and 9 以更好地了解提供商是什么,以及 Jersey 对不同媒体类型的支持。
  • 是的,我希望 */* 为我工作。但它不起作用。如果我根本不使用@consumes 注释,那么它又会给我一个例外。
  • 请重新阅读我的评论,以及我提供的链接。仅仅因为您使用*/*,并不意味着您的应用程序可以支持它。您需要提供程序来处理您在 @Consumes 注释中宣传支持的每个单独的类型
  • 明白了!感谢您的回复。

标签: java rest jax-rs jersey-2.0


【解决方案1】:

您不应该在资源类或方法上使用@Consume 注释来使用所有媒体类型。

来自规范,第 3.5 章,声明媒体类型功能:

应用程序类可以声明支持的请求和响应 使用 @Consumes 和 @Produces 注释的媒体类型 分别。这些注释可以应用于资源方法, 资源类,或实体提供者(参见第 4.2.3 节)。用于 资源方法上的这些注释会覆盖资源上的任何注释 类或实体提供者上的方法参数或返回类型。 在没有这些注释的情况下,支持任何媒体 假定类型(“*/*”)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    相关资源
    最近更新 更多