【问题标题】:There is no Action mapped for namespace [/] and action name [abc] associated with context path [APP_NAME]没有为与上下文路径 [APP_NAME] 关联的命名空间 [/] 和操作名称 [abc] 映射的操作
【发布时间】:2013-07-23 08:31:07
【问题描述】:

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

我的 Annotated Action 类看起来像这样,它使用拦截器,我的架构基于 Spring 3、Struts 2,并使用 Struts2 Convention Plugin

@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

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

【问题讨论】:

    标签: struts2 annotations struts2-convention-plugin action-mapping


    【解决方案1】:

    您的配置错误。你应该

    • 在你的包中扩展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="/">
    

    如果你想使用 Spring DI 在你的 Actions 中注入 bean,你需要在 struts.xml 中加入如下设置:

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

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

    【讨论】:

      猜你喜欢
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      • 2014-10-02
      • 1970-01-01
      相关资源
      最近更新 更多