vaadin + spring 引导:无法转发到请求的错误页面

vaadin + spring boot: Cannot forward to error page for request

通过单一视图应用程序 vaadin 7.7.7,spring-boot 1.5 我检查来自用户的 uri 片段 https:/tld/#!category-name-1 如果类别存在则显示项目,如果不存在

VaadinService.getCurrentResponse().sendError(404, "page not found!");

但我在更新 spring-boot 1.5 和 vaadin 7.7.7(嵌入 tomcat)后出现错误:

Cannot forward to error page for request [/vaadinServlet/UIDL/] as the response has already been committed. As a result, the response may have the wrong status code. If your application is running on WebSphere Application Server you may be able to resolve this problem by setting com.ibm.ws.webcontainer.invokeFlushAfterService to false

如何从 vaadin 向用户发送 http 错误页面?

ErrorPageCutomizer.java

@Component
public class ErrorPageCutomizer implements EmbeddedServletContainerCustomizer {
    @Override
    public void customize(ConfigurableEmbeddedServletContainer container) {
        container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/error/404"));
        container.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error/500"));
    }
}

RestController.java

import org.springframework.boot.autoconfigure.web.ErrorController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ErrorHandlingController implements ErrorController {

    private static final String PATH = "/error";

    @RequestMapping(value = PATH + "/404")
    public String error404() {
        return "<div style='font-weight:bold; margin-top:200px; text-align:center; font-size:160%;'>Page not found...<br><a href=\"https://tld\">to home</a></div>";
    }

    @RequestMapping(value = PATH + "/500")
    public String error500() {
        return "<div style='font-weight:bold; margin-top:200px; text-align:center; font-size:160%;'>500 Internal server error...</div>";
    }

    @Override
    public String getErrorPath() {
        return PATH;
    }
}

您是否尝试过 SystemMessagesProvider。在该提供程序中,您可以为各种错误定义一个 errorUrl:

public class YourServlet extends VaadinServlet
{
    @Override
    protected void servletInitialized() throws ServletException
    {
        super.servletInitialized();

        getService().setSystemMessagesProvider(new SystemMessagesProvider()
        {
            @Override
            public SystemMessages getSystemMessages(SystemMessagesInfo systemMessagesInfo)
            {
                final CustomizedSystemMessages c = new CustomizedSystemMessages();
                final String errorUrl = "<url to errorpage>";
                c.setSessionExpiredURL(errorUrl);
                c.setSessionExpiredNotificationEnabled(false);

                c.setAuthenticationErrorURL(errorUrl);
                c.setAuthenticationErrorNotificationEnabled(false);

                c.setCommunicationErrorURL(errorUrl);
                c.setCommunicationErrorNotificationEnabled(false);

                c.setCookiesDisabledURL(errorUrl);
                c.setCookiesDisabledNotificationEnabled(false);

                c.setInternalErrorURL(errorUrl);
                c.setInternalErrorNotificationEnabled(false);

                c.setSessionExpiredURL(errorUrl);
                c.setSessionExpiredNotificationEnabled(false);
                return c;
            }
        });
    }

解决方案是:

 @Configuration
public class AppInitializer implements WebApplicationInitializer {

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