当前位置: 首页 > 知识库问答 >
问题:

Jersey无法捕获任何Jackson异常

公西财
2023-03-14

对于我的RESTAPI,我使用jersey和ExceptionMapper来捕获全局异常。我的应用程序抛出的所有异常都运行良好,但我无法捕获jackson抛出的异常。

例如,我的一个endpoint接受包含枚举的对象。如果请求中的Json有一个不在枚举jersey中的值,则抛出此异常

Can not construct instance of my.package.MyEnum from String value 'HELLO': value not one of declared Enum instance names: [TEST, TEST2]
at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@5922e236; line: 3, column: 1] (through reference chain: java.util.HashSet[0]->....)

尽管我创造了这个映射器

@Provider
@Component
public class JacksonExceptionMapper implements ExceptionMapper<JsonMappingException> {
  @Override
  public Response toResponse(JsonMappingException e) {
    ....
  }
}

代码永远不会到达这个映射器。

为了捕捉这些异常,我们需要做些什么吗?

编辑说明:我尝试过让JU不那么通用,而不是使用JsonMappingException,在这种情况下,我使用InvalidFormatException调用映射器。但我仍然不明白,因为InvalidFormatException扩展了JsonMappingException,也应该调用它

共有3个答案

龚远
2023-03-14

从版本2.29.1[1]开始,如果您要注册JacksonFeature,您现在可以在不注册异常映射器[2]的情况下这样做:

register(JacksonFeature.withoutExceptionMappers());

[1] https://github.com/eclipse-ee4j/jersey/pull/4225

[2]https://eclipse-ee4j.github.io/jersey.github.io/apidocs/2.34/jersey/org/glassfish/jersey/jackson/JacksonFeature.html#withoutExceptionMappers--

厍和颂
2023-03-14

您好,现在似乎退出了一个替代答案,它不需要禁用Jersey AUTO\u DISCOVERY功能。

只需使用@Priority(1)注释来注释您自己的异常映射器。数字越小,优先级越高。由于Jackson自己的映射器没有任何优先级注释,因此将执行您的映射器:

@Priority(1)
public class MyJsonMappingExceptionMapper implements ExceptionMapper<JsonMappingException>
鲁华灿
2023-03-14

有同样的问题<问题是JsonMappingExceptionMapper在映射器之前启动实际的异常是com类。fasterxml。杰克逊。数据绑定。exc.InvalidFormatException和映射器定义com。fasterxml。杰克逊。jaxrs。基础JsonMappingException,因此它更特定于异常<您可以看到,Jersey的异常处理程序寻找最准确的处理程序(请参见org.glassfish.Jersey.internal.ExceptionMapperFactory#find(java.lang.Class,T))。

要覆盖此行为,只需禁用映射器:

>

  • 使用XML:

    使用代码:resourceConfig。属性(CommonProperties.FEATURE\u AUTO\u DISCOVERY\u DISABLE,true) 其中resourceConfig的类型为org。玻璃鱼。运动衫服务器服务器配置。


    您还可以编写自己的特定映射器:

    public class MyJsonMappingExceptionMapper implements ExceptionMapper<JsonMappingException>
    

    但我认为这是一种过度杀戮。

  •  类似资料:
    • 问题内容: 我想在我的静态服务中捕获json映射异常,以防输入json无效。 它抛出,但我不知道如何或在何处捕获此异常。我想捕获此异常并发送回适当的错误响应。 一切正常,但是如果json主体格式不正确,则会引发异常。我想抓住这个例外。 问题答案: 最终对我有用的是声明的提供者,例如

    • 问题内容: 我如何编写一个块来捕获所有异常? 问题答案: 你可以,但你可能不应该: 但是,这也会捕获类似的异常,而你通常不希望那样,对吗?除非你立即重新引发异常,否则请参阅docs中的以下示例:

    • 所以 我有一个函数,有一个回调,所以我把它包装在一个挂起函数使用,但当它错误了,它是崩溃整个应用程序。 这里有一个概念是正在发生的事情。 2022-03-04 16:09:45.410 19289-19438/in.app.androidE/AndreidRuntime: FATAL EXCEPTION: DefaultDispatcher-Worers-3进程:in.app.android,PI

    • 我正在尝试使用以下代码使用流 API 获取 S3 对象的文件大小: 如果该项不存在,我会得到以下错误: [2015年10月13日星期二23:03:32][错误][客户端54.225.205.152]PHP警告:找不到文件或目录:s3://mybucket/myfile.jpg在/var/www/vendor/Aws/Aws-SDK-PHP/src/Aws/S3/stream wrapper . P

    • 我通过激发Baeldung在Spring Security页面上的防止暴力身份验证尝试,为我的登录服务实现了暴力阻止机制,如下所示: 当用户未经验证时,LoginService抛出InvalidCredentialException(),然后我试图在AuthenticationFailureListener类中捕获此异常: 当出现错误时,则登录测试服务。将调用loginFailed()方法。然而,

    • 是否有可能在Delphi中构建一个代码片段,使假设的EChuckNorrisException无法捕获? 对于Java编程语言,我刚刚发现在Uncatchable ChuckNorriseException中,答案是肯定的