2

我使用它作为在 Struts2 上创建仅 REST 配置的参考:

https://cwiki.apache.org/confluence/display/WW/REST+Plugin

我目前的问题是拦截器。我创建了一个示例拦截器,应该在操作被触发之前执行。

这里是:

public class AuthInterceptor extends AbstractInterceptor implements Interceptor
{
    public String intercept(ActionInvocation invocation) throws Exception {

        System.out.println("intercepting AuthInterceptor...");

        return invocation.invoke();
    }

    public void destroy() {
        System.out.println("Destroying AuthInterceptor...");
    }
    public void init() {
        System.out.println("Initializing AuthInterceptor...");
    }
}

这是我的 struts.xml 文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
    <constant name="struts.devMode" value="true"/>

    <constant name="struts.mapper.class" value="rest" />

    <constant name="struts.convention.action.suffix" value="Controller"/>
    <constant name="struts.convention.action.mapAllMatches" value="true"/>
    <constant name="struts.convention.default.parent.package" value="rest-default"/>
    <constant name="struts.convention.package.locators" value="controllers"/>

    <package name="default" extends="struts-default">
        <interceptors>
            <interceptor name="myInterceptor" class="com.company.interceptors.AuthInterceptor"/>
            <interceptor-stack name="myStack">
                <interceptor-ref name="myInterceptor"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
        </interceptors>
        <default-interceptor-ref name="myStack"/>
    </package>
</struts>

日志(catalina.out)说我的拦截器已初始化,但实际上从未拦截任何东西。

Initializing AuthInterceptor...

显然,映射器类default-interceptor-ref不能很好地工作。rest是这样吗?还是我在这里做错了什么?

4

2 回答 2

2

你需要改变这个

<constant name="struts.convention.default.parent.package" value="default"/>
<package name="default" extends="rest-default">

创建动作配置时的约定插件继承父包中定义的拦截器。要定义父包,您可以使用@ParentPackage注释或上面定义所有操作的父包的常量。

于 2014-12-27T20:49:48.173 回答
1

先前的响应是正确的,但要在拦截器中实现所有 REST 功能,您必须将拦截器堆栈更改为:

<interceptor-stack name="myStack">
    <interceptor-ref name="myInterceptor"/>
    <interceptor-ref name="restDefaultStack"/>
</interceptor-stack>
于 2017-12-13T13:47:45.310 回答