Struts 1.3的Struts Action Invocation Framework

时间:2010-10-24 13:23:37

标签: struts interceptor

我正在尝试集成SAIF插件来拦截我的struts动作。我从中学习 http://struts.sourceforge.net/saif/index.html

我写的配置如下: 的struts-config.xml

<plug-in className="net.sf.struts.saif.SAIFPlugin">
    <set-property property="interceptor-config" value="/WEB-INF/interceptor-config.xml" />
</plug-in>

拦截-config.xml中

<interceptor-config>
 <interceptor name="componentInterceptor" type="net.sf.struts.saif.ComponentInterceptor"/>
 <interceptor name="testInterceptor" type="net.sf.struts.saif.TestInterceptor"/>

 <default-interceptors>
  <interceptor name="componentInterceptor"/>
 </default-interceptors>

 <action type="org.apache.struts.webapp.example.EditRegistrationAction">
  <interceptor name="testInterceptor"/>
 </action>
</interceptor-config> 

我得到这样的错误:

javax.servlet.UnavailableException: Specified RequestProcessor not compatible with saif.
    at org.apache.struts.action.ActionServlet.init(ActionServlet.java:402)
    at javax.servlet.GenericServlet.init(GenericServlet.java:212)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1139)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:966)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:3996)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4266)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:736)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
    at org.apache.catalina.core.StandardService.start(StandardService.java:448)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:700)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)
你可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

之前我没有使用过Struts Action Invocation Framework,但我从Tiles那里熟悉了异常消息。 Tiles会抛出这样的消息:Specified RequestProcessor not compatible with TilesRequestProcessor所以我认为除了消息的熟悉程度(在你的情况下Specified RequestProcessor not compatible with saif)之外,原因也可能是相同的。

这是一个article,它修复了Tiles插件。可以帮到你。

当Struts Servlet初始化时,它会执行所有插件的初始化。该消息应该来自您的插件的init方法,如果它与Tiles相同,那么应该使用Class.isAssignableFrom进行测试。

编辑:查看SAIF插件的源代码并在其中找到:

protected void initRequestProcessorClass(ActionServlet servlet, ModuleConfig config) throws ServletException {
  .........
  .........
  ControllerConfig ctrlConfig = config.getControllerConfig();
  String configProcessorClassname = ctrlConfig.getProcessorClass();
  .........
  .........
  // Check if specified request processor is compatible with saif.
  try {
    Class saifProcessorClass = SAIFRequestProcessor.class;
    Class saifTilesProcessorClass = SAIFTilesRequestProcessor.class;
    Class configProcessorClass = Class.forName(configProcessorClassname);
    if (!saifProcessorClass.isAssignableFrom(configProcessorClass)
       && !saifTilesProcessorClass.isAssignableFrom(configProcessorClass)) {
      String msg = "Specified RequestProcessor not compatible with saif.";
      throw new ServletException(msg);
    }
  } catch (Exception ex) {
    throw new ServletException(ex);
  } 
  .........
  .........
}

它似乎与Tiles插件相同,所以我指出的文章包含答案。

答案 1 :(得分:1)

从struts用户邮件列表中引用this message

  

SAIF不太可能起作用   使用默认的S1.3配置   请求处理器是不同的 - 你   可以尝试使用旧请求   如果您的应用程序没有处理器   依靠它。

     

AFAICT SAIF无法使用   标准以外的任何东西(旧)   请求处理器,但它可能是   可能会破解它,所以它会。