2

在我的 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>

我也尝试过devModetrue 或 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

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

4

1 回答 1

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结果。

于 2013-07-23T09:19:20.910 回答