2013-07-23 91 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)指向它。