0

我正在尝试集成 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)

你能帮我解决这个问题吗?

4

2 回答 2

1

我以前没有使用过 Struts 动作调用框架,但是我对 Tiles 中的异常消息很熟悉。Tiles 抛出这样的消息:Specified RequestProcessor not compatible with TilesRequestProcessor所以我认为除了消息的熟悉度(在你的情况下Specified RequestProcessor not compatible with saif)之外,原因也有可能是相同的。

这是一篇在 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 插件相同,因此我指出的文章包含答案。

于 2010-10-24T13:58:18.440 回答
1

从 struts 用户邮件列表中引用此消息:

SAIF 不太可能使用默认的 S1.3 配置,因为请求处理器不同——如果您的应用程序不依赖它,您可以尝试使用旧的请求处理器。

AFAICT SAIF 不能与标准(旧)请求处理器以外的任何东西一起使用,但它可能会破解它。

于 2010-10-25T02:26:41.840 回答