仅REST - default-interceptor-ref不起作用

时间:2014-12-27 20:19:31

标签: java rest struts2 interceptorstack struts2-rest-plugin

我将此作为参考在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映射器类配合使用。是这样的吗?或者我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

您需要更改此

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

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

答案 1 :(得分:1)

之前的respuest是正确的但是为了实现拦截器中的所有REST功能,您必须将交换器堆栈更改为:

<interceptor-stack name="myStack">
    <interceptor-ref name="myInterceptor"/>
    <interceptor-ref name="restDefaultStack"/>
</interceptor-stack>