使用 @Security 时引发的异常为 RuntimeException
Posted
技术标签:
【中文标题】使用 @Security 时引发的异常为 RuntimeException【英文标题】:Exceptions raised as RuntimeException when using @Security 【发布时间】:2015-10-20 10:40:11 【问题描述】:在我的应用程序中,我有一个扩展异常的ApplicationException
类。对于许多错误情况,我使用预定义的消息提出此ApplicationException
。我还有一个扩展HttpErrorHandler
的错误处理程序类。在那里,在onServerError()
方法中,我检查引发的异常是否是ApplciationException
。如果是这样,我将错误消息作为 JSON 字符串返回。否则,我会返回一般错误消息。
一切都按预期工作,直到我将 @Security
注释添加到我的控制器方法中。从那时起,所有的例外都被提升到java.lang.RuntimeException
。
举个例子,抛出的内容如下:
- with @Security annotation: java.lang.RuntimeException: com.mypackage.ApplicationException: Invalid value supplied for entered parameter 'sort'
- without @Security annotation: com.mypackage.ApplicationException: Invalid value supplied for entered parameter 'sort'
我的 Authenticator 类(扩展 Security.Authenticator
的类)只覆盖了 getUsername()
和 onUnauthorized()
方法。
有没有办法在仍然使用@Security
的同时保留ApplicationException
?
谢谢
【问题讨论】:
【参考方案1】:这很不幸(也是不好的做法),但默认情况下 @Security
注释有一个捕获所有异常处理程序,如 here 所示。
注意:Throwable
是 Exception
和 RuntimeException
的父级
我认为您唯一的选择是用您自己的 (@MySecurity
?) 重新实现 @Security
操作包装器,并专门重新实现 call
方法,而不使用全部捕获处理程序,并且可能放置您自己的.
希望能有所帮助。
【讨论】:
我明白了。我应该查看一下 Security 类的来源。可悲的是,您似乎是对的,唯一的方法是覆盖派生类中的 call() 方法。以上是关于使用 @Security 时引发的异常为 RuntimeException的主要内容,如果未能解决你的问题,请参考以下文章
如何处理 grails spring-security-rest 插件中的自定义身份验证异常?
在身份验证 Spring Security + WebFlux 期间抛出和处理自定义异常