vaadin + spring boot:无法转发到错误页面以获取请求

时间:2017-02-17 08:29:20

标签: spring spring-boot http-status-code-404 vaadin http-status-code-500

通过单视图应用程序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;
    }
}

2 个答案:

答案 0 :(得分:0)

Soliution是:

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

答案 1 :(得分:-1)

您是否尝试过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;
            }
        });
    }