Spring Boot에서 Error Page Filter를 비활성화하려면 어떻게 해야 합니까?
Tomcat에서 실행되어야 하는 SOAP 서비스를 만들고 있습니다.
응용 프로그램에 다음과 같은 스프링 부트를 사용하고 있습니다.
@Configuration
@EnableAutoConfiguration(exclude = ErrorMvcAutoConfiguration.class)
public class AppConfig {
}
내 웹 서비스(예):
@Component
@WebService
public class MyWebservice {
@WebMethod
@WebResult
public String test() {
throw new MyException();
}
}
@WebFault
public class MyException extends Exception {
}
문제:
웹 서비스 클래스 내에서 예외를 발생시킬 때마다 다음 메시지가 서버에 기록됩니다.
ErrorPageFilter: 응답이 이미 커밋되었기 때문에 요청 [/services/MyWebservice]의 오류 페이지로 전달할 수 없습니다.그 결과 응답에 잘못된 상태 코드가 할당될 수 있습니다.응용 프로그램이 WebSphere Application Server에서 실행 중인 경우 com.ibm.ws을 설정하여 이 문제를 해결할 수 있습니다.webcontainer.displayFlush After Service를 false로 설정
질문:.
어떻게 하면 예방할 수 있을까요?
를 디세블로 하려면ErrorPageFilter
(1.3.0으로 테스트 완료)RELEASE)를 스프링 구성에 다음 콩을 추가합니다.
@Bean
public ErrorPageFilter errorPageFilter() {
return new ErrorPageFilter();
}
@Bean
public FilterRegistrationBean disableSpringBootErrorFilter(ErrorPageFilter filter) {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(filter);
filterRegistrationBean.setEnabled(false);
return filterRegistrationBean;
}
Error Page Filter를 디세블로 하는 가장 간단한 방법은 다음과 같습니다.
@SpringBootApplication
public class App extends SpringBootServletInitializer {
public App() {
super();
setRegisterErrorPageFilter(false); // <- this one
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(App.class);
}
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
@SpringBootApplication
public class MyApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
//set register error pagefilter false
setRegisterErrorPageFilter(false);
builder.sources(MyApplication.class);
return builder;
}
}
가장 좋은 방법은 WebSphere 컨테이너에 ErrorPageFiltering을 중지하도록 지시하는 것입니다.이를 위해서는 server.xml 파일에 속성을 정의해야 합니다.
<webContainer throwExceptionWhenUnableToCompleteOrDispatch="false" invokeFlushAfterService="false"></webContainer>
또는 spring application.properties 파일에서 비활성화 시킬 수도 있습니다.
logging.level.org.springframework.boot.context.web.ErrorPageFilter=off
나는 첫 번째 방법이 더 좋다.이게 도움이 됐으면 좋겠다.
소식통에서 찾은 바로는ErrorPageFilter.java
에는 다음 코드가 있습니다.
private void doFilter(HttpServletRequest request, HttpServletResponse response,
FilterChain chain) throws IOException, ServletException {
ErrorWrapperResponse wrapped = new ErrorWrapperResponse(response);
try {
chain.doFilter(request, wrapped);
int status = wrapped.getStatus();
if (status >= 400) {
handleErrorStatus(request, response, status, wrapped.getMessage());
response.flushBuffer();
}
else if (!request.isAsyncStarted() && !response.isCommitted()) {
response.flushBuffer();
}
}
catch (Throwable ex) {
handleException(request, response, wrapped, ex);
response.flushBuffer();
}
}
보시다시피 예외를 무시하고 응답 코드 > = 400을 반환하면 일부 코드가 실행됩니다.응답이 이미 커밋되었는지 여부를 추가로 확인해야 합니다.
ErrorPageFilter를 삭제하는 방법은 다음과 같습니다.
protected WebApplicationContext run(SpringApplication application) {
application.getSources().remove(ErrorPageFilter.class);
return super.run(application);
}
크리스
public class Application extends SpringBootServletInitializer
{
private static final Logger logger = LogManager.getLogger(Application.class);
public Application()
{
super();
setRegisterErrorPageFilter(false);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
언급URL : https://stackoverflow.com/questions/30170586/how-to-disable-errorpagefilter-in-spring-boot
'programing' 카테고리의 다른 글
Python에서 JSON을 XML로 변환 (0) | 2023.02.27 |
---|---|
Swift 개체를 사전으로 변환하는 방법 (0) | 2023.02.27 |
Wordpress에서 현지화된 스크립트의 Data 매개 변수 업데이트 (0) | 2023.02.27 |
sql ignoring 대소문자의 문자열을 비교하는 방법 (0) | 2023.02.27 |
Eslint는 Typescript 앱의 모든 enum이 이미 상위 범위에서 선언되었다고 말합니다. (0) | 2023.02.27 |