抛出 WebApplicationException 时 Jersey 会产生意外的默认媒体类型

2024-02-23

我正在使用 JAX-RS API 开发一个 Web 服务,并以 Jersey 1.17 作为我的实现。

我希望客户可以在 JSON 和 XML 之间进行选择,他们使用AcceptHTTP 标头。当客户端不包含以下内容时,我希望 JSON 成为默认值Accept请求中的标头。我试图通过放置来实现这一点MediaType.APPLICATION_JSON before MediaType.APPLICATION_XML in the Produces注解。

这似乎在正常情况下有效:

$ curl 'http://localhost:8080/webservice/Bob'
{"text":"Hello, Bob"}

$ curl -H'Accept: application/json' 'http://localhost:8080/webservice/Bob'
{"text":"Hello, Bob"}

$ curl -H'Accept: application/xml' 'http://localhost:8080/webservice/Bob'
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Greeting text="Hello, Bob"/>

但如果我抛出一个WebApplicationException从我的资源类的构造函数中,响应媒体类型默认为 XML:

$ curl 'http://localhost:8080/webservice/Vader'
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Error message="Illegal name"/>

如果客户端包括Acceptheader 媒体类型正确:

$ curl -H'Accept: application/json' 'http://localhost:8080/webservice/Vader'
{"message":"Illegal name"}

如何将 Jersey 配置为使用默认值,甚至对于从资源类构造函数引发的错误也是如此?

这是我的资源类的代码(GitHub 上的完整示例 https://github.com/glerup/jersey-error-handling-sample-app):

package org.example.errorhandling;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;

import org.example.errorhandling.repr.Error;
import org.example.errorhandling.repr.Greeting;

@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Path("/{name}")
public class Greeter {
    private final String name;

    public Greeter(@PathParam("name") String name) {
        if ("Vader".equals(name)) {
            Error error = new Error();
            error.message = "Illegal name";
            Response errorResponse = Response.status(Status.BAD_REQUEST).entity(error).build();
            throw new WebApplicationException(errorResponse);
        } else {
            this.name = name;
        }
    }

    @GET
    public Response greet() {
        Greeting greeting = new Greeting();
        greeting.text = "Hello, " + name;
        return Response.ok(greeting).build();
    }
}

此问题有一个解决方法,原因是建议 https://stackoverflow.com/questions/21877409/jersey-produces-unexpected-default-media-type-when-throwing-webapplicationexcept#comment33226533_21919071 from usul_ https://stackoverflow.com/users/2635643/usul.

解决方法是使用selectVariant()以编程方式选择与匹配的媒体类型的机制Accept请求中的标头。这使得可以以重复首选顺序为代价强制执行默认媒体类型。

这是修改为使用此技术的构造函数(完整代码在 GitHub 上 https://github.com/glerup/jersey-error-handling-sample-app/tree/experiment/select-variant):

public Greeter(@PathParam("name") String name, @Context Request request) {
    if ("Vader".equals(name)) {
        Error error = new Error();
        error.message = "Illegal name";
        List<Variant> variants = Variant.mediaTypes(MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_XML_TYPE).add().build();
        Variant variant = request.selectVariant(variants);
        Response errorResponse = Response.status(Status.BAD_REQUEST).entity(error).variant(variant).build();
        throw new WebApplicationException(errorResponse);
    } else {
        this.name = name;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

抛出 WebApplicationException 时 Jersey 会产生意外的默认媒体类型 的相关文章

  • Spring Rest POST Json RequestBody 不支持内容类型

    当我尝试使用 post 方法发布新对象时 RequestBody 无法识别 contentType Spring 已经配置完毕 POST 可以与其他对象一起使用 但不能与这个特定对象一起使用 org springframework web
  • 使用 Hibernate 或 Spring 打印 DBMS_OUTPUT.put_line

    我想知道 Hibernate 或 Spring 或任何第 3 方库是否提供将 DBMS OUTPUT put line 消息直接打印到 system out 或日志文件的能力 目的是在控制台中同时显示 PLSQL 日志消息和 java 日志
  • Android - 内容值覆盖现有行

    我正在尝试使用插入值ContentValues 我已将 5 个值插入到 5 列中 运行应用程序后 我只有最后一组值的行ContentValues 前四组未插入 ContentValues cv new ContentValues cv pu
  • 使用 .NET 2.0 解析 JSON

    想要改进这篇文章吗 提供此问题的详细答案 包括引用和解释为什么你的答案是正确的 不够详细的答案可能会被编辑或删除 我有一个用 C 编写的应用程序 带有 NET Framework 2 0 版本 不幸的是 我无法选择更新到较新版本的 NET
  • JPA 为每个项目选择最新实例

    假设我有一个会议实体 每次会议都有一个与会者和一个会议日期 在我的会议表中 我可能为每个与会者举行多个会议 每个会议都有不同的日期 我需要一个 JPA 查询 该查询将为所有与会者仅选择最新的会议 例如 如果我的桌子看起来像这样 Meetin
  • UnsupportedOperationException:特权进程中不允许使用 WebView

    我在用android sharedUserId android uid system 在我的清单中获得一些不可避免的权利 从 HDMI 输入读取安卓盒子 http eweat manufacturer globalsources com s
  • java“类文件包含错误的类”错误

    我正在尝试制作一个控制台应用程序来测试我的网络服务 我成功部署了一个网络服务http localhost 8080 WS myWS http localhost 8080 WS myWS我用 wsimport 制作了代理类 wsimport
  • JavaPreparedStatementUTF-8字符问题

    我有一份准备好的声明 PreparedStatement st 在我的代码中 我尝试使用 st setString 方法 st setString 1 userName userName 的值为 ak a setString 方法将 ak
  • 如何加快 jar 签名者的速度?

    我使用 ant 来签署我的 jars 以进行网络启动部署 Ant signjar 在 Web 启动签名时非常慢 如何加快签名过程 我找到了一种可能的解决方案 早些时候 在构建脚本 ant signjar 中 按顺序调用所有 jar 我们使用
  • jsf 中的类型未找到属性

    我正在尝试调用 jsf 中使用 primefaces 的属性 但我有错误 500 在托管bean PersonelBean 类型上找不到 我正在使用 hibernate jsf 和 spring PersonelBean java Mana
  • 一个领域模型,多个 json 视图

    我们有一组域类 它们使用球衣服务通过 jackson 序列化为 json 我们目前正在使用 JAXB 对类进行注释 尽管我们并不局限于此 这很好用 但我们希望为不同的用例提供不同的类序列化 Web site 移动应用程序 管理工具 公共AP
  • 在同一台计算机上设置 JBoss 的多个实例

    我在 JBoss 社区中找到了下一页 http www jboss org community wiki ConfigurePorts http www jboss org community wiki ConfigurePorts 有下一
  • 在 HttpClient4 中使用 PoolingHttpClientConnectionManager 的正确方法出现问题 java.lang.IllegalStateException: 连接池关闭

    我正在 Java 中利用 HTTPclient4 发送 HTTP 请求并处理 HTTP 响应 我想使用连接池来提高性能 但我无法找到合适的方法来做到这一点 我正在 Java 中利用 HTTPclient4 发送 HTTP 请求并处理 HTT
  • Java 8 Stream - 为什么过滤器方法不执行? [复制]

    这个问题在这里已经有答案了 我正在学习使用java流进行过滤 但是过滤后的流没有打印任何内容 我认为过滤器方法没有被执行 我的过滤代码如下 Stream of d2 a2 b1 b3 c filter s gt s startsWith b
  • Java中如何限制文件大小

    我正在我的应用程序中创建一个文件 并继续向该文件中写入一些内容 但是当我的文件达到一定大小 比如说 100 行 后 我想删除第一行并将新行写入底部 要求是我的文件应该受到限制 但它应该保留我写入文件的最新内容 请告诉我在Java中是否可行
  • 如何在jpa中共享EntityManagerFactory

    我是 jpa 的新手 这是场景 我正在开发一个 Web 应用程序 其中 多个用户可以登录 当 user1 注销时 我正在使用下面的代码 public static void closeEntityManagerFactory if enti
  • 从 AJP 连接器请求中检索 Shibboleth 属性

    当我在 Apache 上运行 Shibboleth 身份验证时遇到了一个奇怪的问题 当 Tomcat7 在后端运行时 Apache 通过 mod proxy ajp 发送所有内容 Shibboleth 的参数也是如此 In the 文档 h
  • ThreeJS无法加载Json文件

    首先 我已经读过这个问题 https stackoverflow com questions 17201888 three js exporter export object not working with jsonloader r58没
  • Web 应用程序似乎启动了名为 [22] 的线程,但未能停止它。这很可能造成内存泄漏

    我有一个 Web 应用程序 后端有 Servlet 部署在 tomcat 上 该应用程序是简单的java应用程序 我经常在服务器日志中看到此错误 严重 Web 应用程序似乎启动了一个名为 22 但未能阻止它 这很有可能 造成内存泄漏 是否存
  • 在 Vavr 中结合任一者?

    我有几个Vavr https www vavr io Either https www vavr io vavr docs either的 我想调用一个函数Right每个 Either 的值 例如 Either

随机推荐

  • 如何在UIView上插入图片?

    下面的代码在 UIView 上打印一行 我只想知道我要编写的代码能够在视图顶部插入图像 import UIKit class draw UIView var line UIBezierPath var line1 UIBezierPath
  • Ruby 中的横切日志记录

    我正在尝试从外部向方法添加日志记录 面向方面 的风格 class A def test puts I m Doing something end end class A with logging alias method test orig
  • :hover 的 CSS 伪类在 IE7 中不起作用

    我有问题 hoverCSS 的伪类 我用它就像 tr lightRow hover color red 它可以在 Safari 和 Firefox 中运行 但不能在 IE7 中运行 请帮我 IE7 支持 hover 至少在标准模式下是这样
  • 按下按钮以允许全屏查看内容时是否可以隐藏选项卡栏?

    我的基于导航的应用程序的详细视图中有一个 UITabBar 我将文本和图像存储在表格视图中 并希望用户能够点击单元格来隐藏导航控制器和选项卡栏 以便全屏查看内容 我找到了隐藏顶部栏的代码 但隐藏选项卡栏似乎并不容易 UIApplicatio
  • UIButton 图像的色调

    我注意到当我放置白色或黑色UIImage into a UISegmentedControl它会自动对其进行颜色遮罩以匹配分段控件的色调 我觉得这真的很酷 并且想知道我是否也可以在其他地方这样做 例如 我有一堆形状统一但颜色不同的按钮 我是
  • 是什么原因导致 com.aerospike.client.AerospikeException: java.io.EOFException? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 这是什么原因呢 com aerospike client AerospikeException java io EOFE
  • 使用 XSL 呈现整个网页的优点/缺点

    我正处于与客户一起规划一个项目的初步阶段 以重做他们当前的网站 我查看了他们当前的网站 了解他们当前正在处理哪些问题 经过检查 我注意到每个页面都完全使用 XSLT 呈现 我熟悉 XSLT 我用它来渲染需要在客户端经常刷新的自定义控件 但从
  • 根据 pandas 数据帧的名称绘制正态分布图

    我有一个如下所示的数据框 dateTime Name DateTime day seconds zscore 11 1 2016 15 17 james 11 1 2016 15 17 Tue 55020 1 158266091 11 1
  • RouterLink 在 Angular 6 中不起作用

    我正在观看 Brad Traversy 教程进行编码 我确实按照说的做了 这是我的 app module ts import BrowserModule from angular platform browser import NgModu
  • 在 phpoffice/phpword 上添加图表

    我知道如何在 PHPExcel 上添加图表 但我还需要在 docx 文件上插入图表 是否可以使用 phpoffice phpword 操作图表 如果不可能 您知道适合这项工作的好库吗 实际上不可能在 PHPWord 文档中添加图表 但该功能
  • 选择范围中的第一个字母 ( PostgreSQL )

    我正在尝试从单词的第一个字母在某个范围内的表中进行选择 例如 a f 我尝试使用这样的 where 子句 WHERE lower substring title from 1 for 1 IN ARRAY a k t 希望我稍后能找到一种动
  • 浏览器和凉亭。规范方法

    我现在使用 npm 中无法开箱即用的软件包的方式是这样的 package json 有 napa angular angular bower angular angular animate angular bower angular ani
  • 这个指针转换是否违反了严格的别名规则?

    这是 Quake III Arena 的快速反平方根实现 float Q rsqrt float number long i float x2 y const float threehalfs 1 5F x2 number 0 5F y n
  • GDB:创建局部变量?

    我正在使用 Xcode 的调试器 当停在断点处时 是否可以在 GDB 命令提示符中键入命令来创建局部变量 如果是这样 怎么办 请举个例子 我知道我可以在代码中完成它 然后重新编译程序 但我正在寻找一种更快的方法 如果您不需要在代码中引用变量
  • ABCpdf 转换 html 锚点以跳转到同一 PDF 中的另一个页面

    我使用 ABCpdf 动态生成 PDF 其中包含一个目录 该目录将链接到同一 PDF 中的其他页面 问题是 HTML 中锚标记的路径更改为临时文件的绝对路径 例如 ABCpdf 将呈现链接的 href a href elementId Li
  • 如何检查整数中的重复序列

    我有一个字母数字字符串 我想检查其中的整数模式重复 而且它们应该是连续的 Example 12341234qwe应该告诉我1234被重复 1234qwe1234 should NOT告诉我1234重复 因为它不连续 12121212应被视为
  • 如何向 select2 放置元素添加特定类?

    我通过 css 定制了 select2 及其通用类和 id 现在 我正在尝试自定义一个特定的类 该类将提供给 select2 然后在 css 中应用到它 我的问题 不是每个说的选择 而是它的删除 带有类的 div选择2拖放 附加到正文 我如
  • 常量之间的区别。指针和引用?

    常量指针和引用有什么区别 常量指针顾名思义是不能再次绑定的 参考的情况也是如此 我想知道在什么样的情况下 其中一种会比另一种更受青睐 他们的 C 标准和实现有何不同 cheers const 指针有 3 种类型 Data that p po
  • 构建 clang 示例时出现致命错误:未找到“type_traits”文件 #include

    我正在尝试建立打印函数名称 http llvm org viewvc llvm project cfe trunk examples PrintFunctionNames PrintFunctionNames cpp view markup
  • 抛出 WebApplicationException 时 Jersey 会产生意外的默认媒体类型

    我正在使用 JAX RS API 开发一个 Web 服务 并以 Jersey 1 17 作为我的实现 我希望客户可以在 JSON 和 XML 之间进行选择 他们使用AcceptHTTP 标头 当客户端不包含以下内容时 我希望 JSON 成为