尝试从控制器返回html页面时找不到资源

时间:2019-07-31 10:43:01

标签: java spring-boot

我无法在springboot中呈现html页面。 这是代码...

@RestController
    public class ProductController {
        @Autowired
        ProductService service;

        @InitBinder
        public void initBinder(WebDataBinder webDataBinder) {
            SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
            dateFormat.setLenient(false);
            webDataBinder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
        }

        @RequestMapping(value = { "/", "/home" })
        public ModelAndView home() {
            System.out.println("sdasasas");
            return new ModelAndView("home");
        }
  

但是每当我按下http://localhost:8080/home时,它就会显示以下日志       -8080-exec-4] o.s.w.s.v.ContentNegotiatingViewResolver:在给定的[text / html,application / xhtml + xml,image / webp,   图片/ apng,应用程序/有符号交换; v = b3,应用程序/xml;q=0.9,    / ; q = 0.8]       2019-07-31 16:05:25.354调试14850 --- [nio-8080-exec-4] o.s.w.servlet.view.InternalResourceView:视图名称'home',模型{}       2019-07-31 16:05:25.354调试14850 --- [nio-8080-exec-4] o.s.w.servlet.view.InternalResourceView:转发至   [/WEB-INF/html/home.html]       2019-07-31 16:05:25.354调试14850 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet:GET的“ FORWARD”调度   “ /WEB-INF/html/home.html”,参数= {}       2019-07-31 16:05:25.356调试14850 --- [nio-8080-exec-4] o.s.w.s.handler.SimpleUrlHandlerMapping:映射到   ResourceHttpRequestHandler [“ classpath:/ META-INF / resources /”,   “ classpath:/ resources /”,“ classpath:/ static /”,“ classpath:/ public /”,   “ /”]       2019-07-31 16:05:25.356 WARN 14850 --- [nio-8080-exec-4] o.s.w.s.r.ResourceHttpRequestHandler:带有“ WEB-INF”的路径或   “ META-INF”:[WEB-INF / html / home.html]       2019-07-31 16:05:25.356调试14850--[nio-8080-exec-4] o.s.w.s.r.ResourceHttpRequestHandler:找不到资源       2019-07-31 16:05:25.357调试14850 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet:从“ FORWARD”退出   调度状态404       2019-07-31 16:05:25.357调试14850--[nio-8080-exec-4] o.j.s.OpenEntityManagerInViewInterceptor:关闭JPA EntityManager   在OpenEntityManagerInViewInterceptor中       2019-07-31 16:05:25.357调试14850--[nio-8080-exec-4] o.s.web.servlet.DispatcherServlet:已完成404 NOT_FOUND       2019-07-31 16:05:25.357调试14850 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet:GET的“ ERROR”派发   “ /错误”,参数= {}

3 个答案:

答案 0 :(得分:2)

在使用Spring MVC时,应始终使用@Controller注释。 @RestController@Controller不同。

@Controller返回一个在MVC应用程序中使用的视图,

@RestController返回一个响应(大多数为Json)时,它会使用Jackson罐将您的Java对象转换为Json,这些都用于api。

答案 1 :(得分:1)

@RestController不能用于返回要解析的视图。它应该返回将被写入响应主体的数据

        @RestController     //change it to @Controller
        public class ProductController {
        @Autowired
        ProductService service;

@Controller和@RestController批注之间的区别在于,@Controller是创建模型对象的Map并查找视图,但是@RestController只是返回对象,并且对象数据以JSON或XML的形式直接写入HTTP响应中

答案 2 :(得分:0)

对于基于 MVC的应用,避免使用@RestController,该应用必须返回视图。它主要用于REST API。虽然 @Controller可以返回视图

有关@RestController 的更多信息:

enter image description here

  • 此注释是@Controller的专用版本,其中添加了 @Controller@ResponseBody自动注释。因此我们不必在我们的映射方法中添加@ResponseBody。那意味着 @ResponseBody是默认活动状态。
  • 如果您使用@RestController,则无法返回视图(通过使用 Viewresolver(春季/春季启动)
  • @RestController还将响应转换为JSON/XML automatically,因为@ResponseBody使返回的对象成为可能在体内的对象,e.g. JSON or XML

Controller vs RestController


@RestController
    public class ProductController {
        @Autowired
        ProductService service;

        @RequestMapping(value = { "/", "/home" })
        public @ResponseBody ModelAndView home() {
            System.out.println("sdasasas");
            ModelAndView modelAndView = new ModelAndView();
            modelAndView.setViewName("home");
            return modelAndView;
        }
}

项目结构 enter image description here

无需指定spring.mvc.view.prefix=/WEB-INF/html/ spring.mvc.view.suffix=.html

此外,请确保您没有任何带有@EnableWebMvc批注的其他类。这会弄乱 spring-boot自动配置。