@kopelitsa의 답변을 기반으로 솔루션을 제공하고 싶었 습니다 . 주요 차이점은 다음과 같습니다.
- .NET Framework를 사용하여 컨트롤러 예외 처리를 재사용합니다
HandlerExceptionResolver
.
- XML 구성을 통해 Java 구성 사용
먼저, 일반 RestController / Controller에서 발생하는 예외를 처리하는 클래스가 있는지 확인해야합니다 ( @RestControllerAdvice
또는 주석으로 주석 처리 된 클래스 @ControllerAdvice
및로 주석 처리 된 메서드 @ExceptionHandler
). 이것은 컨트롤러에서 발생하는 예외를 처리합니다. 다음은 RestControllerAdvice를 사용하는 예입니다.
@RestControllerAdvice
public class ExceptionTranslator {
@ExceptionHandler(RuntimeException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ErrorDTO processRuntimeException(RuntimeException e) {
return createErrorDTO(HttpStatus.INTERNAL_SERVER_ERROR, "An internal server error occurred.", e);
}
private ErrorDTO createErrorDTO(HttpStatus status, String message, Exception e) {
(...)
}
}
Spring Security 필터 체인에서이 동작을 재사용하려면 필터를 정의하고 보안 구성에 연결해야합니다. 필터는 예외를 위에 정의 된 예외 처리로 리디렉션해야합니다. 다음은 예입니다.
@Component
public class FilterChainExceptionHandler extends OncePerRequestFilter {
private final Logger log = LoggerFactory.getLogger(getClass());
@Autowired
@Qualifier("handlerExceptionResolver")
private HandlerExceptionResolver resolver;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
try {
filterChain.doFilter(request, response);
} catch (Exception e) {
log.error("Spring Security Filter Chain Exception:", e);
resolver.resolveException(request, response, null, e);
}
}
}
그런 다음 생성 된 필터를 SecurityConfiguration에 추가해야합니다. 모든 선행 필터의 예외가 포착되지 않기 때문에 매우 일찍 체인에 연결해야합니다. 제 경우에는 LogoutFilter
. 공식 문서에서 기본 필터 체인과 순서 를 참조하십시오 . 다음은 예입니다.
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private FilterChainExceptionHandler filterChainExceptionHandler;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.addFilterBefore(filterChainExceptionHandler, LogoutFilter.class)
(...)
}
}