2013-06-23 70 views
5

Tôi đang sử dụng Struts 2 (phiên bản 2.3.14.3) cùng với Sitemesh 3 (phiên bản 3.0-alpha-2) và tôi nhận được một NullPointerException trong trường hợp cerain.Struts 2 + Sitemesh 3 tích hợp - NPE trong FreemarkerDecoratorServlet

Thứ nhất, đây là struts2/cấu hình SiteMesh tôi từ web.xml:

<filter-mapping> 
    <filter-name>struts-prepare</filter-name> 
    <url-pattern>*.do</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping> 

<filter-mapping> 
    <filter-name>sitemesh</filter-name> 
    <url-pattern>*.do</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>INCLUDE</dispatcher> 
</filter-mapping> 

<filter-mapping> 
    <filter-name>struts-execute</filter-name> 
    <url-pattern>*.do</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping> 

<servlet> 
    <servlet-name>sitemesh-freemarker</servlet-name> 
    <servlet-class>org.apache.struts2.sitemesh.FreemarkerDecoratorServlet</servlet-class> 
    <init-param> 
     <param-name>default_encoding</param-name> 
     <param-value>UTF-8</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

Bây giờ, đây là mô tả vấn đề:

Nếu thanh chống dev.mode được kích hoạt và tôi cố gắng truy cập vào một hành động không tồn tại, một Struts ConfigurationException được ném ra.

Trình điều phối Struts cố gắng xử lý ngoại lệ bằng cách gọi org.apache.struts2.dispatcher.Dispatcher.sendError(), ghi mẫu lỗi Struts chuẩn (/org/apache/struts2/dispatcher/error.ftl) vào phản ứng.

Bây giờ đây là khi mọi thứ bắt đầu sai.

Vì yêu cầu ban đầu được trang trí bằng bộ lọc sitemesh, ngay cả sau khi xảy ra lỗi cấu hình, sitemesh cố gắng áp dụng trang trí, dẫn đến ngoại lệ, vì bối cảnh hành động Struts không được thiết lập đúng do ngoại lệ cấu hình và đang nhận được những điều sau đây:

java.lang.NullPointerException 
org.apache.struts2.sitemesh.FreemarkerDecoratorServlet.process(FreemarkerDecoratorServlet.java:176) 

đây là mã thích hợp từ FreemarkerDecoratorServlet.java - biến ctx là null:

ActionContext ctx = ServletActionContext.getActionContext(request); 
model = freemarkerManager.buildTemplateModel(ctx.getValueStack(), ctx.getActionInvocation().getAction(), servletContext, request, response, wrapper); 

tôi nghĩ rằng SiteMesh không nên cố gắng để trang trí các phản ứng trong trường hợp có lỗi khi gọi hành động, nhưng tôi không biết cách thực hiện điều đó mà không sửa đổi tích hợp Struts2/Sitemesh.

Bất kỳ ý tưởng nào về cách tránh NPE?

Cảm ơn, Marek

+1

Hiển thị toàn bộ tệp 'web.xml'. –

+0

tại đây là: http://www.filedropper.com/web_1 –

+0

Tại sao mẫu url bộ lọc 'struts-execute' của bạn là'/struts/* '? –

Trả lời

1

Một cách giải quyết có thể được đặt đoạn này vào cuối của tập tin Struts.xml:

<action name="pageNotFound"> 
    <result>404.jsp</result> 
</action> 

<action name="*"> 
    <result type="redirectAction"> 
     <param name="actionName">pageNotFound</param> 
    </result> 
</action> 

nó nên chặn tất cả các khai báo, yêu cầu hành động và chuyển hướng họ đến một hành động hiện tại với JSP của nó.

Chỉ cần thử ...;)

+0

Dịch vụ chăm sóc người giải quyết để giải thích? –