2

我在Struts2的代码中使用注释时,正在此问题相关。没有映射为命名空间操作[/]和动作名称[ABC]与上下文路径[APP_NAME]

我带注释的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真的还是假的,但它是没有帮助的。

我的目录结构是

+--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 

而且它是唯一一个我在这里提到的,而它给在我的应用程序可用的每个动作类相同的异常例外。

回答

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注入豆你操作,你需要把下面的设置在struts.xml

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

而且,请不要使用chain结果:这是官方文档中气馁。这是极有可能的是你有一个更好的方式做你想要达到的目标,例如与redirectAction结果,而不是chain结果。

相关问题