0

我正在尝试使用 struts2 创建一个宁静的服务。当我在依赖项中添加 struts2-rest-plugin 时,struts 操作没有采用默认方法(执行)。它正在寻找 create() 或 index() 方法。

struts2-convention-plugin 和 struts2-rest-plugin

<dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-convention-plugin</artifactId>
            <version>${struts.version}</version>
</dependency>
<dependency>
             <groupId>org.apache.struts</groupId>
             <artifactId>struts2-rest-plugin</artifactId>
             <version>${struts.version}</version>
</dependency>

我在struts.xml中有所有这些常量

    <constant name="struts.devMode" value="false" />
    <constant name="struts.i18n.encoding" value="UTF-8" />
    <constant name="struts.action.extension" value="action," />
    <constant name="struts.objectFactory" value="spring" />
    <constant name="struts.custom.i18n.resources" value="ApplicationResources,errors,global" />
    <constant name="struts.multipart.maxSize" value="2097152" />
    <constant name="struts.ui.theme" value="css_xhtml" />
    <constant name="struts.codebehind.pathPrefix" value="/WEB-INF/pages/" />
    <constant name="struts.enable.SlashesInActionNames" value="true" />
    <constant name="struts.convention.action.disableScanning" value="true" />
    <constant name="struts.mapper.alwaysSelectFullNamespace" value="false" />
   <constant name="struts.convention.package.locators" value="controller"/> 
   <constant name="struts.convention.action.suffix" value="Controller"/> 
   <constant name="struts.convention.action.mapAllMatches" value="false"/>
   <constant name="struts.convention.default.parent.package" value="rest-default"/>

执行 Web 项目时出现错误

ERROR [tomcat-http--34] Dispatcher.error(38) | Exception occurred during processing request: com.vxl.appanalytix.webapp.action.LoginAction.create()
java.lang.NoSuchMethodException: com.vxl.appanalytix.webapp.action.LoginAction.create()
    at java.lang.Class.getMethod(Class.java:1655)
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.getActionMethod(AnnotationValidationInterceptor.java:75)
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:47)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
    at org.apache.struts2.rest.RestActionInvocation.invoke(RestActionInvocation.java:138)
    at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
    at org.apache.struts2.rest.RestActionInvocation.invoke(RestActionInvocation.java:138)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:238)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)
    at org.apache.struts2.rest.RestActionInvocation.invoke(RestActionInvocation.java:138)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:238)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)

我的项目有 spring 用于依赖管理,使用我们计划使用 struts2 的 spring MCV。我尝试使用 spring restful 服务,但我遇到了一些调度程序错误,所以我转向 struts2-rest-plugin。在这里,我作为服务实现的控制器类分别具有用于 HTTP GET 和 PUT 的 index() 和 create() 等方法。其余插件究竟是如何工作的。

4

2 回答 2

2

请阅读文档 [1][2],如果您想将普通 Web 应用程序与休息服务混合使用,请考虑使用struts.rest.namespace[3]将所有休息端点移动到专用命名空间

[1] http://struts.apache.org/development/2.x/docs/rest-plugin.html

[2] http://struts.apache.org/development/2.x/docs/convention-plugin.html#ConventionPlugin-ConvertingaCodebehindbasedapplicationtoConvention

[3] http://struts.apache.org/development/2.x/docs/rest-plugin.html#RESTPlugin-Settings

于 2013-09-24T06:43:06.847 回答
1

使用该struts2-rest插件,以及convention-plugin意味着您的操作类不再具有默认的执行方法。事实上,您可能没有执行方法,但仍然有一个有效的 REST-ful 控制器。

URL 映射到您的类的方式由convention-plugin. 这在这里清楚地解释了:http: //struts.apache.org/docs/convention-plugin.html

此外,struts.rest.namespace- 方法对我不起作用。不知何故,Struts 无法以这种方式工作。相反,我做了以下事情: -

<constant name="struts.convention.default.parent.package" value="myRestPackage"/>
<package name="myRestPackage" extends="rest-default" namespace="/rest"/>

通过这种方式,我让 Struts 感觉我的 REST Web 服务调用的名称空间是/rest.

于 2016-03-03T18:59:10.320 回答