我有一个带有多个端点的控制器。每个终结点都映射到一个服务,该服务可能返回 200 或引发异常,然后进行处理并将返回正确的错误消息。
例如,如果未找到用户,我会抛出一个UserNotFoundException
,然后将其捕获在控制器顾问中,该控制器顾问将其映射到 404 未找到。
一切正常,直到我添加了@PreAuthorize。它看起来像这样:
@PreAuthorize("@userController.userService.getUser(#userId).username == authentication.principal.name")
问题是,如果getUser
抛出异常,我会得到 500 而不是 404。
堆栈跟踪如下所示:
java.lang.IllegalArgumentException: 无法计算表达式 '@userController.userService.getUser(#userId).username == authentication.principal.name'
在。。。
由以下原因引起:org.springframework.expression.ExpressionInvocationTargetException:尝试在类型为...
在。。。
原因:UserNotFoundException
所以看起来问题是由UserNotFoundException
引起的,PreAuthorize
实现没有正确地重新抛出。
这看起来像一个典型的场景,但我研究了很多,但没有找到任何解决方案。找不到用户时如何获取我的 404?
在这种情况下,使用@PreAuthorize
没有额外的好处。
只需将UserNotFoundException
放在业务逻辑中,并将此异常映射到ControllerAdvisor
中的404
,就像以前一样。