Tomcatで実行する必要がある [〜#〜] soap [〜#〜] サービスを作成しています。
アプリケーションにSpring Bootを使用しています。
@Configuration
@EnableAutoConfiguration(exclude = ErrorMvcAutoConfiguration.class)
public class AppConfig {
}
私のWebサービス(例):
@Component
@WebService
public class MyWebservice {
@WebMethod
@WebResult
public String test() {
throw new MyException();
}
}
@WebFault
public class MyException extends Exception {
}
問題:
webserviceクラス内で例外をスローするたびに、次のメッセージがサーバーに記録されます。
ErrorPageFilter:応答が既にコミットされているため、要求[/ services/MyWebservice]のエラーページに転送できません。その結果、応答のステータスコードが間違っている可能性があります。アプリケーションがWebSphere Application Serverで実行されている場合、com.ibm.ws.webcontainer.invokeFlushAfterServiceをfalseに設定することにより、この問題を解決できる場合があります。
質問:
どうすればこれを防ぐことができますか?
Spring BootでErrorPageFilter
(1.3.0.RELEASEでテスト済み)を無効にするには、Spring構成に次のBeanを追加します。
@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;
}
ErrorPageFilterを無効にする最も簡単な方法は次のとおりです。
@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;
}
}
私はソースで_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);
}
クリス
最善の方法は、WebSphereコンテナーにErrorPageFilteringを停止するように指示することです。これを実現するには、server.xmlファイルでプロパティを定義する必要があります。
<webContainer throwExceptionWhenUnableToCompleteOrDispatch="false" invokeFlushAfterService="false"></webContainer>
または、spring application.propertiesファイルで無効にすることもできます
logging.level.org.springframework.boot.context.web.ErrorPageFilter=off
私は最初の方法を好みます。これが役立つことを願っています。