2015-04-29 13 views
22

Tôi đang cố gắng tạo ứng dụng "hello world" bằng gradle, spring spring và spring mvc với trình xem và giải mã đơn giản nhất.Định cấu hình ViewResolver với Khởi động mùa xuân và chú thích cho phép Không tìm thấy ánh xạ cho yêu cầu HTTP với lỗi URI

Tôi bắt đầu từ thymeleaf spring boot example và tôi chỉ muốn loại bỏ thymeleaf để tạo một ứng dụng mvc đơn giản hơn bằng cách sử dụng html thuần túy và InternalResourceViewResolver. Tôi có một greeting.html duy nhất tôi muốn phục vụ được đặt tại src/main/webapp/WEB-INF. Khi tôi chạy ứng dụng, tôi nhận được

No mapping found for HTTP request with URI [/WEB-INF/greeting.html] in DispatcherServlet with name 'dispatcherServlet' 

Đây là lỗi thường gặp và có nhiều câu trả lời trên web nhưng dường như không có gì hữu ích.

Đây là Application.java tôi

@SpringBootApplication 
public class Application { 
    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 

Đây là GreetingController.java tôi

@Controller 
public class GreetingController { 
    @RequestMapping("/greeting") 
    public String greeting() { 
     return "greeting"; 
    } 
} 

Đây là MvcConfiguration.java tôi

@Configuration 
@EnableWebMvc 
public class MvcConfiguration extends WebMvcConfigurerAdapter{ 
    @Bean 
    public ViewResolver getViewResolver() { 
     InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 
     resolver.setPrefix("/WEB-INF/"); 
     resolver.setSuffix(".html"); 
     return resolver; 
    } 
} 

tôi chạy nó với gradle bootRun

Đây là repo với mã: https://github.com/driver-pete/spring-mvc-example

Dưới đây là một số manh mối hơn:

  • Thymeleaf xem giải quyết hoạt động tốt
  • InternalResourceViewResolver giải quyết để con đường đúng đắn
  • WEB-INF và chúc mừng. html dường như có mặt trong các tập tin chiến tranh
  • tôi không có jsp hoặc JSTL vì vậy tôi không bỏ lỡ những lọ như một số có thể đề nghị

Giả thuyết của tôi là servatcher dispatcher bằng cách nào đó được cấu hình để phục vụ trên/* thay vì/như here và ở khắp mọi nơi. Tuy nhiên tôi không có web.xml để những lời khuyên không áp dụng ở đây. Tôi thấy rất nhiều ví dụ làm thế nào để cấu hình servatcher dispatcher lập trình nhưng tôi muốn giữ ứng dụng của tôi ở mức tối thiểu và tôi nghi ngờ rằng khởi động mùa xuân được cho là cấu hình nó ok vì nó hoạt động tốt với thymeleaf.

+0

Đặt trước tiền tố và độ phân giải của chế độ xem có thể được đơn giản hóa bằng cách đặt các thuộc tính này vào tệp application.properties: spring.mvc.view.prefix =/WEB-INF/ spring.mvc.view.suffix = .html – luke

Trả lời

35

Bạn chỉ cần kích hoạt các servlet mặc định, điều này được thực hiện bằng cách thêm dòng sau vào bạn MvcConfiguration:

@Configuration 
@EnableWebMvc 
public class MvcConfiguration extends WebMvcConfigurerAdapter{ 
    @Bean 
    public ViewResolver getViewResolver() { 
     InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 
     resolver.setPrefix("/WEB-INF/"); 
     resolver.setSuffix(".html"); 
     return resolver; 
    } 

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

Về cơ bản những gì đang xảy ra là mùa xuân không biết làm thế nào để xử lý việc xử lý các nội dung như nguyên bản (có thể là một jsp nói), và cấu hình này là cách để cho nó để ủy quyền nó vào container.

+0

Cảm ơn bạn! Điều này không giải quyết được lỗi. Tuy nhiên bằng cách nào đó tài liệu hướng dẫn http://docs.spring.io/spring/docs/current/spring-framework-reference/html/view.html bằng cách nào đó cho thấy ấn tượng rằng mùa xuân có thể xử lý html và jsps ra khỏi hộp. Dường như rơi trở lại servlet mặc định được mô tả như là một khả năng nhưng không phải là cách phục vụ bình thường jsps. Tôi đang thiếu gì? – otognan

+0

Ngoài ra lỗi tương tự với web.xml thường tự giải quyết sau khi thay đổi ánh xạ DispatcherServlet. Tại sao cấu hình chú thích khác nhau? Tôi đang thiếu gì? – otognan

+4

So với việc thêm "tomcat-embed-jasper", để khắc phục sự cố cho tôi, giải pháp của bạn dẫn đến tệp .jsp được hiển thị "thô": Đó là đầu ra thô của tệp jsp bao gồm tất cả các thẻ và không được hiển thị dưới dạng html. – Traubenfuchs

11

Sau khi điều tra thêm, tôi đã khám phá một giải pháp thay thế hoạt động mà không cần thêm phương thức configureDefaultServletHandling. Bạn cần phải thêm động cơ một tomcat nhúng jsp để build.gradle:

compile("org.apache.tomcat.embed:tomcat-embed-jasper") 

Trái ngược với phương pháp configureDefaultServletHandling giải pháp này hoạt động không chỉ với html đồng bằng mà còn với jsp.

Tất cả các giải pháp có sẵn tại: https://github.com/driver-pete/spring-mvc-example Giải pháp này có sẵn trên máy chủ. Giải pháp của Biju nằm trên nhánh DefaultServletHandling_solution.

+0

cảm ơn bạn rất nhiều :) tôi đã có một mã nguồn dựa trên một khuôn khổ mvc mùa xuân cũ, và tôi muốn di chuyển nó đến mvc mùa xuân mới dựa trên khởi động mùa xuân để phát triển và triển khai tốt hơn và dễ dàng hơn. Bạn đã cứu tôi rất nhiều thời gian –

Các vấn đề liên quan