【问题标题】:o.s.boot.context.web.ErrorPage: Cannot forward to error page for request [/] as the response has already been committedos.boot.context.web.ErrorPage:无法转发到请求的错误页面 [/],因为响应已经提交
【发布时间】:2016-09-11 10:50:24
【问题描述】:

当我在 tomcat 8 中渲染这个应用程序时,我一直得到一个空白页面。我看到的唯一错误是:

o.s.boot.context.web.ErrorPageFilter: Cannot forward to error page for 
request [/] as the response has already been committed.

因此我的问题是我无法呈现 index.html 页面。

我拿了一个静态页面并在其中添加了一个 spring-boot 模块。自从我进行更改后,我就无法再次呈现该页面。我在templates下有 index.html 文件

我在控制器中添加了 cmets 以查看它们是否被击中,而它们没有:

@Controller
public class ApplicationController {


    @Autowired
    ContactService contactService;

    @RequestMapping(value="/", method= RequestMethod.GET)
    public String contactForm() throws IOException {
        System.out.println("Inside GET in Application Controller");

        //model.addAttribute("contact", new Contact());

        return "index";
    }

    @RequestMapping(value="/contact", method= RequestMethod.POST)
    public String contactSubmit() throws IOException {

        System.out.println("Inside POST in Application Controller");

        return "index";
    }


}

我使用的是 Thymeleaf 但决定不使用它,这就是方法中的参数为空白的原因。

我已将该项目上传到 GIT,以便其他人在需要时更容易四处浏览和下载。

Project on GIT

----------------更新1----------------------

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    private static final Logger LOGGER = Logger.getLogger(WebConfig.class);

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {

        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);

        registry.addResourceHandler("/css/**").addResourceLocations("/resources/css/");

        registry.addResourceHandler("/images/**").addResourceLocations("/resources/images/");

        registry.addResourceHandler("/image/**").addResourceLocations("/resources/image/");

        registry.addResourceHandler("/javascripts/**").addResourceLocations("/resources/javascripts/");

    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

}

真的没有什么可以证明我能想到的了。如果您也愿意,也可以在 GIT 上查看其他文件。

【问题讨论】:

标签: spring-boot


【解决方案1】:

我在玩你的应用程序。 (git 存储库帮助解决了您的配置问题)。

问题在于您的配置属性和注释的混合。 以下步骤将有助于恢复default Spring Boot 行为。

  1. 将您的index.htm 移动到webapp 目录。
  2. 将所有文件从webapp/resources 复制到webapp
  3. 删除以下配置属性 - spring.mvc.static-path-pattern=/resources/*
  4. 删除映射到/ @RequestMapping(value="/", method= RequestMethod.GET) 和方法本身。 Boot 将处理index.html 映射到ROOT/ 映射混淆 Boot Spring MVC 自动配置。
  5. 您可以完全删除您的WebConfig

下一步是根据需要映射静态资源:

public class AppMvcConfiguration extends WebMvcConfigurerAdapter {
  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    // Including all static resources.

    registry.addResourceHandler("/assets/**", 
              "/css/**", 
              "/img/**",
              "/js/**"
         ).addResourceLocations("/assets/",
              "/css/", 
              "/img/",
              "/js/"
    ).resourceChain(true)
     .addResolver(new PathResourceResolver());

     super.addResourceHandlers(registry);
  }
}

查看我的 git repository

查看更多关于自定义Spring MVC configuration的信息。

【讨论】:

    【解决方案2】:

    方法contactForm()contactSubmit()返回String
    尝试使用@RestController而不是@Controller
    它解决了我的问题

    【讨论】:

      【解决方案3】:

      您的方法中可能缺少“@ResponseBody”。 举个例子

      @RequestMapping(value = "/myMethod", method = RequestMethod.POST, headers = "Accept=application/json") 
      @ResponseBody 
      public String myMethod(HttpServletRequest request, HttpServletResponse response) 
      { 
          // some business logic
      
          retutn "Hi" 
      }
      

      【讨论】:

        猜你喜欢
        • 2018-09-03
        • 1970-01-01
        • 1970-01-01
        • 2016-03-08
        • 2018-11-30
        • 1970-01-01
        • 2021-08-09
        • 2013-06-21
        • 1970-01-01
        相关资源
        最近更新 更多