【问题标题】:Using Interceptor with Annotation in Struts2 with Spring and Convention Plugin在带有 Spring 和 Convention 插件的 Struts2 中使用带注解的拦截器
【发布时间】:2013-07-22 18:59:34
【问题描述】:

我一直在尝试在 struts2 中使用带有注释的拦截器来处理我的请求和响应,以便我可以执行一些前置和后置操作。

但是,我最初使用带有约定插件的 struts 2,我无法真正改变。我的框架中也包含了 spring。

但是,现在的问题是,每当我尝试使用拦截器作为注释时,它都会在应用程序开始时给我以下异常。

SEVERE: Exception starting filter struts2
Unable to load configuration. - [unknown location]
    at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:483)
....
Caused by: Unable to load configuration. - [unknown location]
    at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:58)
.....
Caused by: Unable to find interceptor class referenced by ref-name mylogging - [unknown location]

我的代码结构很简单:

动作类看起来像:

@InterceptorRefs({  
    @InterceptorRef("mylogging")  
}) 
    public class LoginAction implements ModelDriven{
.....
    @Action(value="/login",results={@Result(name="success",location="/jsp/successPage.jsp"),
                @Result(name="login",location="/jsp/userLogin.jsp")})
        public String execute() {
....

Struts.xml:

<struts>
    <constant name="struts.devMode" value="true" />
    <constant name="struts.ui.theme" value="simple" />
    <constant name="struts.enable.SlashesInActionNames" value="true" />
    <constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>
    <package  name="default"  namespace="" extends="struts-default">


     <interceptors>
            <interceptor name="mylogging" 
                class="com.lab.interceptor.LoggingInterceptor">
            </interceptor>
            <interceptor-stack name="loggingStack">
                <interceptor-ref name="mylogging" />
                <interceptor-ref name="defaultStack" />
            </interceptor-stack>
        </interceptors>
    </package>
</struts>

我的部署描述符主体(web.xml):

  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>
        org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    </filter-class>
    <init-param>
            <param-name>actionPackages</param-name>
            <param-value>com.lab.actions</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>

现在希望这将有助于弄清楚它为什么抛出该异常,因为我认为我不需要从我的操作中删除 ModelDriven 的实现。

提前致谢

【问题讨论】:

  • 您在哪里声明您的操作存在于"default" 包中?
  • @DaveNewton 我没听懂你,但我认为
  • 它定义了一个包,但这不是你的动作神奇地出现的地方,除非你指定动作所属的地方。
  • @DaveNewton stackoverflow.com/questions/16621970/… 告诉包名称与我的操作所在的包无关,所以它只是一个有意义的名称而已......
  • ... 拦截器定义在在 S2(非 Java)包中。如果您的操作在另一个 S2(非 Java)包中,它对这些拦截器一无所知(除非操作的 S2(非 Java)包扩展了包含拦截器的 S2(非 Java)包,显然)。所以。您认为您的操作属于哪个 S2(不是 Java)包?提示:它不是“默认”,你的拦截器是在哪里定义的。

标签: spring spring-mvc struts2 annotations struts2-convention-plugin


【解决方案1】:

默认情况下,Convention 插件使用自己的包convention-default,它不包含您在 struts.xml 中定义的包。要改变这一点,您有两个选项,都在文档 [1] 中进行了描述:

  • 使用@ParentPackage注解
  • 或者在struts.xml中定义&lt;constant name="struts.convention.default.parent.package" value="default"/&gt;

[1]http://struts.apache.org/development/2.x/docs/convention-plugin.html#ConventionPlugin-ParentPackageannotation

【讨论】:

    猜你喜欢
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 2014-04-18
    • 1970-01-01
    相关资源
    最近更新 更多