programing

Spring Boot에서 Error Page Filter를 비활성화하려면 어떻게 해야 합니까?

powerit 2023. 2. 27. 22:14
반응형

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

반응형