2014-12-09 25 views
7

Tôi đang chạy một ứng dụng khởi động mùa xuân bên trong một cá thể tomcat độc lập, và tôi đang cố gắng ghi đè lên các trang lỗi. Theo hiểu biết của tôi, Spring cung cấp một bộ lọc ErrorPageFilter cho phép tôi thiết lập các trang lỗi như bình thường đối với Springs EmbeddedServletContainerCustomizer để xử lý trường hợp này chính xác.Khởi động mùa xuân - trang 404 tùy chỉnh với độc lập tomcat

Vì vậy, tôi có tiêu chuẩn initializer tự động cấu hình/servlet của tôi trong một lớp:

@Configuration 
@ComponentScan 
@EnableAutoConfiguration(exclude = [ GroovyTemplateAutoConfiguration, SecurityAutoConfiguration, ErrorMvcAutoConfiguration, JmxAutoConfiguration ]) 
class Application extends SpringBootServletInitializer { 

    @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     application.sources(Application) 
    } 

(Tôi đang sử dụng cùng lớp cho tự động cấu hình và servlet init, đó là lý do tôi chỉ cần vượt qua lớp Application tôi trong cấu hình phương pháp)

Nhìn vào mã nguồn cho SpringBootServletInitializer có vẻ như lớp ErrorPageFilter đang được thêm bằng cách chỉ cần mở rộng lớp đó tại đây. Tôi đã tắt ErrorMvcAutoConfiguration - nhưng một lần nữa, nhìn vào mã nguồn đó có vẻ như chỉ là thiết lập các trang lỗi mặc định và không thực sự thiết lập bất cứ điều gì với ErrorPageFilter.

Sau đó tôi có lỗi tập tin cấu hình của tôi:

@Configuration 
class ErrorConfiguration implements EmbeddedServletContainerCustomizer { 

    @Override public void customize(ConfigurableEmbeddedServletContainer container) { 
     container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/errors/404")) 
    } 

Tuy nhiên, nếu tôi chỉ cần truy cập một URL không hợp lệ, và tôi DispatcherServlet không thể tìm thấy một trận đấu sau đó tôi chỉ nhận được Tomcats /404.html - không tôi xem liên kết với "/errors/404" (Tôi có đường dẫn này được ánh xạ tới mẫu xem thymeleaf, hoạt động tốt - nếu tôi điều hướng đến/errors/404 nó hiển thị ok)

Mọi ý tưởng tại sao trang lỗi tùy chỉnh của tôi không hoạt động? truy tìm nhật ký, tôi nhận được một dòng về số ErrorPageFilter đang được định cấu hình và thiết lập ok khi khởi động ứng dụng, nhưng sau đó không có đề cập nào về bộ lọc làm bất cứ điều gì khi có yêu cầu.

+1

Ví dụ trong tài liệu là với 'EmbeddedServletContainerFactory'. Xem: http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-customizing-configurableembeddedservletcontainerfactory-directly –

+0

Tuyệt vời - Tôi đã tìm kiếm tài liệu trong nhiều ngày, không chắc chắn cách tôi bỏ lỡ điều đó! Tôi đã hiểu sai về điểm của lớp ErrorPageFilter rồi sao?Các ý kiến ​​trong mã nguồn/javadoc thực sự làm cho nó nghe như mục đích duy nhất của lớp đó là cho phép các trang lỗi tùy chỉnh trong triển khai WAR độc lập? – rhinds

Trả lời

7

Bạn có thể sử dụng đoạn mã sau cho phiên bản cũ của khởi động mùa xuân (0.5.x)

public class ServerCustomization extends ServerProperties { 

    @Override 
    public void customize(ConfigurableEmbeddedServletContainerFactory factory) { 

    super.customize(factory); 
    factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, 
      "/yourpath/error-not-found.jsp")); 
    factory.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, 
      "/yourpath/error-internal.jsp")); 
    factory.addErrorPages(new ErrorPage("/yourpath/error-other.jsp")); 
    } 
} 

phiên bản khởi động mùa xuân mới hơn (1.X.RELEASE) có một số refactoring xung quanh ServerProperties. Xem bên dưới,

public class ServerCustomization extends ServerProperties { 

    @Override 
    public void customize(ConfigurableEmbeddedServletContainer container) { 

    super.customize(container); 
    container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, 
      "/jsp/404.jsp")); 
    container.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, 
      "/jsp/500.jsp")); 
    container.addErrorPages(new ErrorPage("/jsp/error.jsp")); 
    } 

} 

Sau đó xác định bean để tiêm ServerProperies.

@Bean 
public ServerProperties getServerProperties() { 
    return new ServerCustomization(); 
} 

dự án mẫu posted in git

Rất Quan trọng: Nếu bạn đang sử dụng maven để xây dựng, Bạn phải lưu trữ tất cả các tập tin tài nguyên dưới thư mục/nguồn src/main. Nếu không, maven sẽ không thêm các tệp đó vào tạo phẩm jar cuối cùng.

+0

Tôi có thể sẽ đi với câu trả lời của Evgeni trong các bình luận ở trên, nhưng điều này trông giống như một giải pháp tốt là tốt, vì vậy sẽ đánh dấu điều này là chấp nhận. – rhinds

+0

Ok, tôi đã nói chuyện sớm - không phải những giải pháp này đang tạo sự khác biệt .. bất kỳ ý tưởng nào khác? – rhinds

+0

Câu trả lời này đúng như nỗ lực của riêng bạn ('ServerProperties' là một' EmbeddedServletContainerCustomizer'), vì vậy sẽ hữu ích khi có thêm thông tin (như một dự án hoàn chỉnh). –

2

Bạn có thể sử dụng chế độ xem lỗi dựng sẵn của Spring Boot bằng cách triển khai chế độ xem có tên error hoặc tắt bằng cách đặt error.whitelabel.enabled=false thuộc tính và thực hiện của riêng bạn. Đó là explained more in the docs.

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