【问题标题】:Interceptor not getting called in Struts拦截器没有在 Struts 中被调用
【发布时间】:2015-05-05 01:53:10
【问题描述】:

我的拦截器(validation)在操作之前或之后没有被调用。任何想法如何让它工作?

注意:每次调用 default 拦截器。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
  <package name="default" namespace="/" extends="struts-default,json-default">
    <result-types>
      <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" />
      <result-type name="json" class="org.apache.struts2.json.JSONResult" />
    </result-types>

    <interceptors>
       <interceptor name="validation" class="ValidatorBaseAction"/>
      <interceptor-stack name="default">
        <interceptor-ref name="logger"/>
      </interceptor-stack>
      <interceptor-stack name="validationStack">
         <interceptor-ref name="validation"/>
         <interceptor-ref name="default"/>
      </interceptor-stack>
    </interceptors>

    <default-interceptor-ref name="default" />

    <action
        name="viewRequest"
        class="ViewAction"
        method="execute">
      <interceptor-ref name="validationStack" /> 
      <result name="input" type="redirectAction">explore</result>
      <result name="success" type="redirect">/showRequest.do?${explorerParameters}</result>
    </action>
  </package>
</struts>

【问题讨论】:

  • 哪个拦截器没有被调用?
  • 你试过这个&lt;interceptor-stack name="validationStack"&gt; &lt;interceptor-ref name="default"/&gt; &lt;interceptor-ref name="validation"/&gt; &lt;/interceptor-stack&gt;
  • 你怎么知道它没有被调用?
  • 默认堆栈名称是defaultStack

标签: java struts2 interceptor struts2-interceptors interceptorstack


【解决方案1】:

主要问题:

  • class 对于操作和拦截器都必须指定 FQCN,而不仅仅是名称。然后将其更改为:

    <interceptor name="validation" class="com.foo.bar.ValidatorBaseAction"/>
    

    并将您的操作更改为

    <action name="viewRequest" class="com.foo.bar.ViewAction" method="execute">
    

附带问题:

  • 不要叫它ValidatorBaseAction,如果它是Interceptor,叫它ValidatorBaseInterceptor。并确保其中没有 Action
  • 不要使用拦截器堆栈只有一个拦截器,我敢肯定它在 99% 的情况下是无用的。如果您不确定,只需使用 defaultStack,将您的拦截器添加到其中。

抛光:

  • json-default 已经扩展了struts-default,所以这个

    <package ... extends="struts-default,json-default"
    

    等价于这个

    <package ... extends="json-default"
    

    这样更干净;

  • 由于你扩展了 json-default,所以不需要重新定义 JSON 结果,然后移除

    <result-type name="json" class="org.apache.struts2.json.JSONResult" />
    

    那没用。

  • 尝试在重定向到 Action 时始终首选 redirectAction 结果,并且仅在重定向到其他资源或外部 URL 时使用 redirect 结果

【讨论】:

  • 我刚刚从我这里的 sn-p 中剥离了 FQCN。我实际上在我的代码中有它们。此外,我无法将验证添加到默认堆栈,因为我只需要它用于选择性操作。
  • 你最后一句话没有意义,请解释清楚
  • 我无法将我的拦截器添加到默认堆栈,因为更多操作使用了默认堆栈,我只需要在这些操作的子集中使用我的拦截器。
  • 绝对!只需在您的validationStack 中包含验证拦截器和defaultStack,而不是仅由一个拦截器组成的最小默认堆栈。 defaultStack != default....
  • 这很奇怪... 1) 在发布不起作用的代码时,不要随意“剥离”一些东西(你是否剥离了我们应该知道的其他内容?) 2) 你怎么知道你的拦截器没有被调用? 3)你怎么知道正在调用“默认”堆栈(您的“默认”,而不是真正的 defaultStack)? 4) 始终使用唯一的名称。 validation 是另一个拦截器的名称。顺便说一句,如果问题仍然存在,请考虑发布您的拦截器、操作类、完整的 struts 配置和 web.xml
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多