对于我的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,也应该调用它
从版本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--
您好,现在似乎退出了一个替代答案,它不需要禁用Jersey AUTO\u DISCOVERY功能。
只需使用@Priority(1)注释来注释您自己的异常映射器。数字越小,优先级越高。由于Jackson自己的映射器没有任何优先级注释,因此将执行您的映射器:
@Priority(1)
public class MyJsonMappingExceptionMapper implements ExceptionMapper<JsonMappingException>
有同样的问题<问题是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中,答案是肯定的