2013-07-23 47 views
0

我一直试图在我的应用程序中实现拦截器,并且一切正常,直到我没有在我的动作中包含拦截器注释为止。但是,当我刚刚加入InterceptoRef标签在我的动作像下面的代码:使用拦截器不工作的Struts 2注释

@InterceptorRefs({ 
    @InterceptorRef("mylogging") 
}) 
public class LoginAction implements ModelDriven{ 

它开始让我异常

SEVERE: Exception starting filter struts2 
Unable to load configuration. - [unknown location] 
    at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:431) 
    at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:69) 
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:51) 
    at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:281) 
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:262) 
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:107) 
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4746) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5399) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) 
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) 
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633) 
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:977) 
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1654) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 
Caused by: Unable to load configuration. - [unknown location] 
    at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:58) 
    at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:374) 
    at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:418) 
    ... 19 more 
Caused by: Unable to find interceptor class referenced by ref-name mylogging - [unknown location] 

我使用Struts 2 Struts2的会展-插件,休眠, Spring和使用Maven进行依赖管理。我在Maven的POM文件中定义

我具有以下的依赖关系:

  <dependency> 
     <groupId>org.apache.struts</groupId> 
     <artifactId>struts2-core</artifactId> 
     <version>2.1.8.1</version> 
     </dependency> 

    <!-- Struts 2 + Spring plugins --> 
<dependency> 
    <groupId>org.apache.struts</groupId> 
    <artifactId>struts2-spring-plugin</artifactId> 
    <version>2.1.8.1</version> 
</dependency> 

      <!-- MySQL database driver --> 
    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.9</version> 
    </dependency> 
    <!-- Spring framework --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring</artifactId> 
     <version>2.5.6</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-web</artifactId> 
     <version>2.5.6</version> 
    </dependency> 
    <!-- Hibernate core --> 
    <dependency> 
    <groupId>asm</groupId> 
    <artifactId>asm-all</artifactId> 
    <version>3.3</version> 
</dependency> 
<dependency> 
    <groupId>asm</groupId> 
    <artifactId>asm</artifactId> 
    <version>3.3</version> 
</dependency> 
    <dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-core</artifactId> 
    <version>3.6.7.Final</version> 
</dependency> 
<dependency> 
      <groupId>org.apache.struts</groupId> 
     <artifactId>struts2-convention-plugin</artifactId> 
     <version>2.1.8.1</version> 
    </dependency> 
      <dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>javax.servlet-api</artifactId> 
    <version>3.0.1</version> 
    <scope>provided</scope> 
</dependency> 
      <dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.15</version> 
</dependency> 

我已经放置在struts.xml在src根。所以就我所知,在配置中一定有一些缺失。

struts.xml的配置文件:

<struts> 
    <constant name="struts.devMode" value="false" /> 
    <constant name="struts.convention.package.locators.basePackage" value="com.abc.lab"/> 
    <constant name="struts.convention.exclude.packages" value="org.apache.struts.*,org.apache.struts2.*,org.springframework.web.struts.*,org.springframework.web.struts2.*,org.hibernate.*,WarFileName.*"/> 
    <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> 
+1

和以前一样的答案。 –

回答

0

如果你得到这样的错误“无法找到由参名XYZ引用拦截器类”。这意味着公约将你的动作放在哪个包中,并不会扩展定义拦截器的包。要解决这个问题,1)使用@ParentPackage批注(或struts.convention.default.parent.package)传递定义拦截器的包的名称,或者2)在XML中创建一个包,该包扩展了定义拦截器的包,并使用@ParentPackage(或struts.convention.default.parent.package)指向它。