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
Hiển thị toàn bộ tệp 'web.xml'. –
tại đây là: http://www.filedropper.com/web_1 –
Tại sao mẫu url bộ lọc 'struts-execute' của bạn là'/struts/* '? –