仅限 REST - 默认拦截器引用不起作用



我使用它作为参考,在 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...");
    }
}

这是我的支柱.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映射器类配合使用。是这样吗?还是我在这里做错了什么?

你需要改变这个

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

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

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

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

最新更新