正确序列化从Spring过滤器抛出的Zalando问题



我正在使用Zalando的问题库,并正在运行以下问题(双关语):

对于从正常控制器抛出的问题,一切都工作正常。在本例中,我有一个自定义Spring过滤器。如果我从过滤器抛出一个问题,则响应是500错误(使用标准的spring错误页面显示),而不是问题中显示的400错误。换句话说,异常被像普通异常一样抛出,而不是被正确序列化为JSON响应。

我如何确保从过滤器抛出的问题也被正确处理/序列化?

我代码:


@Component
class UserVerifiedFilter : OncePerRequestFilter() {
@Throws(ServletException::class, IOException::class)
override fun doFilterInternal(
request: HttpServletRequest,
response: HttpServletResponse,
filterChain: FilterChain
) {
// ...
throw Problem.builder()
.withType(URI.create("https://example.org/email-unverified"))
.withTitle("Email unverified")
.withStatus(Status.BAD_REQUEST)
.withDetail("Email needs to verified to use this endpoint")
.build()

}
}
@RestControllerAdvice
class ControllerExceptionHandler : ProblemHandling, SecurityAdviceTrait

设法通过添加另一个过滤器来解决这个问题,作为链中的第一个。

此过滤器捕获任何异常并手动将其传播到配置的异常处理程序。

@Component
class FilterExceptionHandler : OncePerRequestFilter() {
@Autowired
private lateinit var resolver: HandlerExceptionResolver
private val logger = LoggerFactory.getLogger(javaClass)
@Throws(ServletException::class, IOException::class)
override fun doFilterInternal(
request: HttpServletRequest,
response: HttpServletResponse,
filterChain: FilterChain
) {
try {
filterChain.doFilter(request, response)
} catch (exception: Exception) {
logger.error("Spring Security filter chain exception : {}", exception)
resolver.resolveException(request, response, null, exception)
}
}
}

最新更新