2016-05-13 24 views
6

Tôi có ánh xạ hành động sau đây trong ứng dụng của tôi struts.xml, hoạt động tốt với Struts 2.3.28.1; gọi đến hành động /editApplication khi được xử lý theo phương pháp x.ApplicationHandler.edit.Ánh xạ hành động ký tự đại diện không còn hoạt động sau khi cập nhật lên Struts 2.5

<action name="*Application" class="x.ApplicationHandler" method="{1}"> 
    <result name="input">/WEB-INF/application.jsp</result> 
    <result name="success" type="redirectAction"> 
     <param name="actionName">browseApps</param> 
    </result> 
</action> 

Sau khi nâng cấp lên Struts 2.5, điều này không còn hoạt động. Cố gắng gọi hành động /editApplication hiển thị lỗi 404:

HTTP Status 404 - There is no Action mapped for namespace [/] and action name [editApplication]

Tôi đã xem xét Struts 2.5 release notes, và không thấy bất kỳ đề cập đến thông tin cập nhật đến cách ký tự đại diện có trụ sở công trình lập bản đồ hành động. Có bất kỳ lý do nào khiến cấu hình này không hoạt động nữa không?

+2

Đó là vì SMI đã được Aleksandr giải thích và thực tế là nếu phương pháp không được phép ngoại lệ được ném bằng phương pháp còn thiếu. Tôi tự hỏi nếu nó sẽ là tốt hơn để ném ngoại lệ với "Phương pháp này là không được phép", wdyt? –

+0

Vâng, một ngoại lệ có ý nghĩa hơn có thể rất hữu ích ở đây. – john

+1

Tôi đã đăng ký một vấn đề để trang trải https://issues.apache.org/jira/browse/WW-4640 này –

Trả lời

14

Đó là Strict Method Invocation và vì Struts 2.5 được bật theo mặc định.

Từ các tài liệu về SMI và ánh xạ wildcard:

When using wildcard mapping in actions' definitions SMI works in two ways:

  • SMI is disabled - any wildcard will be substituted with the default RegEx, ie.: <action name="Person*" method="perform*"> will be translated into allowedMethod = "regex:perform([A-Za-z0-9_$]*)" .
  • SMI is enabled - no wildcard substitution will happen, you must strictly define which methods can be accessed by annotations or <allowed-method/> tag.

Bạn có thể vô hiệu hóa nó mỗi <package>.

<package strict-method-invocation="false"> 

HOẶC bạn có thể thêm tên phương thức được phép cho mỗi hành động sử dụng thẻ <allowed-methods>.

<action name="*Application" class="x.ApplicationHandler" method="{1}"> 
    <result name="input">/WEB-INF/application.jsp</result> 
    <result name="success" type="redirectAction"> 
     <param name="actionName">browseApps</param> 
    </result> 

    <allowed-methods>firstMethod, secondMethod, thirdMethod</allowed-methods> 
</action> 

HOẶC thêm tên phương thức được phép cho mỗi gói sử dụng thẻ <global-allowed-methods>.

<package extends="struts-default"> 

    <global-allowed-methods>firstMethod, secondMethod, thirdMethod</global-allowed-methods> 

</package> 

LƯU Ý Để sử dụng thẻ ở trên trong struts.xml bạn phải cập nhật định nghĩa DTD để 2.5.

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE struts PUBLIC 
     "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" 
     "http://struts.apache.org/dtds/struts-2.5.dtd"> 
<struts> 
... 
</struts> 

Ngoài ra còn có @AllowedMethods chú thích trong struts2-convention-plugin cho phép hành động để xác định phương pháp hành động cho phép.

This annotation can be used directly on Action classes or in the package-info.java class in order to specify global allowed methods for all sub-packages.

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