没有为命名空间[/]和与上下文路径[APP_name]关联的操作名称[abc]映射任何操作



我在Struts2代码中使用Annotations时遇到了这个问题。

我的Annotated Action类似乎是这样的,它使用了拦截器,我的体系结构基于Spring 3、Struts 2和Struts2 Convention插件

@InterceptorRefs({  
    @InterceptorRef("mylogging")  
}) 
public class LoginAction  implements ModelDriven{
    User user = new User();
    List<User> users = new ArrayList<User>();
    UserBo userBo;
    @Action(value="/login",results={@Result(name="success",type="chain",location="/jsp/successPage.jsp"),
            @Result(name="login",type="chain",location="/jsp/userLogin.jsp")})
    public String execute() {
        if(user.getUserScreenName()==null)
            return "login";
        System.out.println(userBo.verifyUser(user));
        return "success";
    }

我还试图附上我的部署描述符的详细信息

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>
            org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
        </filter-class>
        <init-param> <param-name>config</param-name> <param-value>struts-default.xml,struts-plugin.xml,struts.xml
</param-value>
            </init-param>
      </filter>

      <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>*.action</url-pattern>
      </filter-mapping>
      <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/classes/resources/config/SpringBeans.xml</param-value>
    </context-param>
       <listener>
        <listener-class>
          org.springframework.web.context.ContextLoaderListener
        </listener-class>
      </listener>

我在struts.xml中定义了我的拦截器,我只是用它来定义拦截器和结果类型

   <struts>
    <constant name="struts.devMode" value="false" />
     <constant name="struts.objectFactory" value="spring" />
     <constant name="struts.convention.package.locators.basePackage" value="com.abc.lab"/>
     <constant name="struts.convention.action.checkImplementsAction" value="false"/>
      <constant name="struts.convention.package.locators" value="action,actions,struts,struts2"/> <package name="default" extends="struts-default" namespace="/">
     <interceptors>
            <interceptor name="mylogging" 
                class="com.abc.lab.interceptor.LoggingInterceptor">
            </interceptor>
            <interceptor-stack name="loggingStack">
                <interceptor-ref name="mylogging" />
                <interceptor-ref name="defaultStack" />    
            </interceptor-stack>
        </interceptors> </package> </struts>

我也尝试过使用devMode true或false,但没有帮助。

我的目录结构是

+--LmsWar/
|  +--pom.xml
|  +--src/
|  |  +--com/
|  |  |  +--abc/
|  |  |  |  +--lab/
|  |  |  |  |  +--actions/
|  |  |  |  |  |  +--HomeAction.java
|  |  |  |  |  |  +--LoginAction.java
|  |  |  |  |  +--bo/
|  |  |  |  |  |  +--impl/
|  |  |  |  |  |  |  +--UserBoImpl.java
|  |  |  |  |  |  +--UserBo.java
|  |  |  |  |  +--dao/
|  |  |  |  |  |  +--impl/
|  |  |  |  |  |  |  +--UserDAOImpl.java
|  |  |  |  |  |  +--UserDAO.java
|  |  |  |  |  +--filter/
|  |  |  |  |  +--interceptor/
|  |  |  |  |  |  +--LoggingInterceptor.java
|  |  |  |  |  +--listener/
|  |  |  |  |  +--model/
|  |  +--resources/
|  |  |  +--com/
|  |  |  |  +--abc/
|  |  |  |  |  +--lab/
|  |  |  |  |  |  +--spring/
|  |  |  |  |  |  |  +--UserBean.xml
|  |  |  +--config/
|  |  |  |  +--database/
|  |  |  |  |  +--properties/
|  |  |  |  |  |  +--database.properties
|  |  |  |  +--spring/
|  |  |  |  |  +--DataSource.xml
|  |  |  |  |  +--HibernateSessionFactory.xml
|  |  |  |  +--SpringBeans.xml
|  |  +--struts.properties
|  |  +--struts.xml
|  +--WebRoot/
|  |  +--jsp/
|  |  |  +--common/
|  |  |  +--layout/
|  |  +--WEB-INF/
|  |  |  +--classes/
|  |  |  +--lib/
|  |  |  +--tiles.xml
|  |  |  +--web.xml

编辑:

在深入了解更多细节并添加详细日志后,我在日志中又得到了一件事。

2013-07-23 16:40:01,578 ERROR com.opensymphony.xwork2.util.finder.ClassFinder.error:38 - Unable to read class [com.abc.lab.actions.LoginAction] java.lang.NoSuchMethodError: org.objectweb.asm.ClassReader.accept(Lorg/objectweb/asm/ClassVisitor;I)V

这只是我在这里提到的一个异常,而它对我的应用程序中可用的每个操作类都给出了相同的异常。

您的配置是错误的。你应该

  • 在您的包中扩展struts-default,以及
  • 将拦截器添加到默认堆栈或其他自定义堆栈中;现在,您的整个堆栈仅由一个拦截器组成,即您的

工作配置:

<package name="default" extends="struts-default">
     <interceptors>
            <interceptor name="mylogging" 
                class="com.abc.lab.interceptor.LoggingInterceptor">
            </interceptor>
            <interceptor-stack name="loggingStack">
                <interceptor-ref name="mylogging" />
                <interceptor-ref name="defaultStack" />    
            </interceptor-stack>
        </interceptors>
</package>

您可能希望在包声明中也包含名称空间,如

<package name="default" extends="struts-default" namespace="/">

如果您想使用SpringDI在Actions中注入bean,则需要在struts.xml:中放入以下设置

<constant name="struts.objectFactory" value="spring" />

请不要使用chain结果:官方文件中不鼓励使用。很可能您有更好的方法来实现您想要实现的目标,例如使用redirectAction结果而不是chain结果。

相关内容

最新更新