2015-05-11 15 views
15

Tôi đang tạo một dịch vụ SOAP sẽ chạy trên Tomcat.
Tôi đang sử dụng Spring Boot cho ứng dụng của tôi, tương tự như:Làm thế nào để vô hiệu hóa ErrorPageFilter trong Spring Boot?

@Configuration 
@EnableAutoConfiguration(exclude = ErrorMvcAutoConfiguration.class) 
public class AppConfig { 
} 


My webservice (ví dụ):

@Component 
@WebService 
public class MyWebservice { 

    @WebMethod 
    @WebResult 
    public String test() { 
     throw new MyException(); 
    } 
} 

@WebFault 
public class MyException extends Exception { 
} 


Vấn đề:
Bất cứ khi nào tôi ném một ngoại lệ trong lớp webservice, thông báo sau được ghi lại trên máy chủ:

ErrorPageFilter: Không thể chuyển tiếp đến trang lỗi cho yêu cầu [/ services/MyWebservice] vì phản hồi đã được cam kết. Do đó, phản hồi có thể có mã trạng thái sai. Nếu ứng dụng của bạn đang chạy trên WebSphere Application Server bạn có thể để giải quyết vấn đề này bằng cách thiết lập com.ibm.ws.webcontainer.invokeFlushAfterService false


Câu hỏi:
Làm thế nào tôi có thể ngăn chặn điều này?

+0

Bạn có thể chia sẻ một số mã để tái tạo sự cố không? –

Trả lời

18

Để vô hiệu hóa ErrorPageFilter trong mùa xuân Boot (thử nghiệm với 1.3.0.RELEASE), thêm đậu sau đây để cấu hình Spring của bạn :

@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; 
} 
+0

Bạn có đang sử dụng vùng chứa nhúng cho mục đích này không? Hoặc triển khai chiến tranh? – Dan

3

tôi tìm thấy trong các nguồn rằng ErrorPageFilter.java có đoạn mã sau:

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(); 
    } 
} 

Như bạn có thể nhìn thấy khi bạn ném một ngoại lệ và trả về một mã phản hồi> = 400 nó sẽ làm một số mã. nên có một số kiểm tra bổ sung nếu phản ứng đã được cam kết hay không.

Cách để loại bỏ các ErrorPageFilter là như thế này

protected WebApplicationContext run(SpringApplication application) { 
    application.getSources().remove(ErrorPageFilter.class); 
    return super.run(application); 
} 

Chris

9

cách đơn giản nhất để vô hiệu hóa ErrorPageFilter là:

@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); 
} 
+1

Đây có vẻ là cách chính thức để làm điều đó, theo báo cáo lỗi trong GitHub. Đây là bản sửa lỗi mà họ đã thêm: https://github.com/spring-projects/spring-boot/commit/11d59df3fd71a656a7869ace4303a8d72e6f777c – Calabacin

+0

Giải pháp này không hoạt động kể từ Spring Boot 1.5.0. –

+0

@ Sõber nó có thể là một lỗi, vì bạn có thể thấy không có gì thay đổi ở đây https://github.com/spring-projects/spring-boot/blame/11d59df3fd71a656a7869ace4303a8d72e6f777c/spring-boot/src/main/java/org/springframework/ boot/context/web/SpringBootServletInitializer.java –

3
@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; 
    } 

} 
-2
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); 
    } 
} 
+0

Điều này giải quyết vấn đề như thế nào? –

+1

Vui lòng xem: [Cách viết câu trả lời hay] (http://stackoverflow.com/help/how-to-answer) – Linuslabo

Các vấn đề liên quan