Java 如何在一个应用程序中部署多个ResteasyInterceptor?

Java 如何在一个应用程序中部署多个ResteasyInterceptor?,java,jboss,web.xml,resteasy,interceptor,Java,Jboss,Web.xml,Resteasy,Interceptor,我正在JBoss7.1.1上使用RestEasy部署一些web服务。我有两个类,它们沿着同一条路径处理不同的资源请求。UserAPI.java句柄/books和/books/{id}等。MaintenanceAPI.java句柄/books/checkedout UserAPI需要以前的登录,该登录由名为AuthInterceptor的RestEasyInterceptor验证。维护API不需要登录,但只能通过本地主机作为GET访问;它由LocalInterceptor处理 为了将它们分开,Au

我正在JBoss7.1.1上使用RestEasy部署一些web服务。我有两个类,它们沿着同一条路径处理不同的资源请求。UserAPI.java句柄
/books
/books/{id}
等。MaintenanceAPI.java句柄
/books/checkedout

UserAPI需要以前的登录,该登录由名为
AuthInterceptor
的RestEasyInterceptor验证。维护API不需要登录,但只能通过本地主机作为GET访问;它由
LocalInterceptor
处理

为了将它们分开,AuthInterceptor的accept()方法在声明.getName()包含(“维护”)时返回false,因此它根本不应该处理
/books/checkedout
。如果
声明.equals(MaintenanceAPI.class)
,LocalInterceptor的accept()方法将返回true

AuthInterceptor在web.xml中的“resteasy.providers”下声明。但是Eclipse认为XML元素中只能有一个参数,所以LocalInterceptor有注释
@Provider
,希望它能神奇地工作

拒绝XML配置

这失败了:

<context-param>
    <param-name>resteasy.providers</param-name>
    <param-value>com.foo.AuthInterceptor</param-value>
    <param-value>com.foo.LocalInterceptor</param-value>
</context-param>

resteasy.providers
com.foo.AuthInterceptor
com.foo.LocalInterceptor
我不确定正确的语法是什么,RestEasy文档中没有帮助。这也失败了:

<context-param>
    <param-name>resteasy.providers</param-name>
    <param-value>com.foo.AuthInterceptor</param-value>
</context-param>
<context-param>
    <param-name>resteasy.providers</param-name>
    <param-value>com.foo.LocalInterceptor</param-value>
</context-param>

resteasy.providers
com.foo.AuthInterceptor
resteasy.providers
com.foo.LocalInterceptor
然而,发生的事情是,从远程机器到
/books/checkedout
(未经授权应失败)的URL请求被路由到UserAPI的
/books/{id}/
处理程序,该处理程序继续尝试处理该请求并返回一个非常大的异常!!这是错误的,有几个原因:它不是正确的路径,不是正确的处理程序,不是正确的参数类型,并且它应该需要一个auth令牌!显然,LocalInterceptor不是通过注释神奇地添加的,因此它没有机会接受请求。AuthInterceptor必须正确地拒绝它,但是为什么会要求UserAPI处理它,而且为什么会为
int{id}
分配字符串“checkedout”

我没有发布代码,因为我在问我是否可以做我正在尝试的事情(比如“为什么我不能将字符串子类化”-如果你理解这个问题,就不需要代码)以及为什么映射试图做错误的事情而不是失败

也许只需正确获取web.xml就可以了?

对于您的xml配置(通常是web.xml),下面是您要查找的内容

<context-param>
    <param-name>resteasy.providers</param-name>
    <param-value>com.foo.AuthInterceptor, com.foo.LocalInterceptor</param-value>
</context-param>
如果我决定保留两个接口,我将使入口路径不同。基本上是这样的

@Path("/maintenance")
@Produces(MediaType.APPLICATION_JSON)
public interface MaintenanceAPI{

    @GET
    @Path("/books/checkedout")
    public Response getCheckedOut(); 
}
// so the url here looks like --> /maintenance/books/checkedout



其他建议-过滤来自
本地主机
远程
的请求,我以前使用过的一种非常强大的技术是访问/角色管理,类似于此

创建一个注释界面,如

@Documented
@Retention (RUNTIME)
@Target({TYPE, METHOD})
public @interface RolesAllowed {
    String[] value();
}
然后,拦截器的accept()方法可以如下所示:

LocalInterceptor.java

@Override
public boolean accept(Class declaring, Method method) {
    if(method.isAnnotationPresent(RolesAllowed.class)){
        RolesAllowed rolesAnnotation = method.getAnnotation(RolesAllowed.class);
        Set<String> rolesSet = new HashSet<String (Arrays.asList(rolesAnnotation.value()));
        return rolesSet.contains("local");
    }
    return false;
}
@Override
public boolean accept(Class declaring, Method method) {
    if(method.isAnnotationPresent(RolesAllowed.class)){
        RolesAllowed rolesAnnotation = method.getAnnotation(RolesAllowed.class);
        Set<String> rolesSet = new HashSet<String (Arrays.asList(rolesAnnotation.value()));
        return rolesSet.contains("remote");
    }
    return false;
}
对于您的XML配置(通常是web.XML),下面是您要查找的内容

<context-param>
    <param-name>resteasy.providers</param-name>
    <param-value>com.foo.AuthInterceptor, com.foo.LocalInterceptor</param-value>
</context-param>
如果我决定保留两个接口,我将使入口路径不同。基本上是这样的

@Path("/maintenance")
@Produces(MediaType.APPLICATION_JSON)
public interface MaintenanceAPI{

    @GET
    @Path("/books/checkedout")
    public Response getCheckedOut(); 
}
// so the url here looks like --> /maintenance/books/checkedout



其他建议-过滤来自
本地主机
远程
的请求,我以前使用过的一种非常强大的技术是访问/角色管理,类似于此

创建一个注释界面,如

@Documented
@Retention (RUNTIME)
@Target({TYPE, METHOD})
public @interface RolesAllowed {
    String[] value();
}
然后,拦截器的accept()方法可以如下所示:

LocalInterceptor.java

@Override
public boolean accept(Class declaring, Method method) {
    if(method.isAnnotationPresent(RolesAllowed.class)){
        RolesAllowed rolesAnnotation = method.getAnnotation(RolesAllowed.class);
        Set<String> rolesSet = new HashSet<String (Arrays.asList(rolesAnnotation.value()));
        return rolesSet.contains("local");
    }
    return false;
}
@Override
public boolean accept(Class declaring, Method method) {
    if(method.isAnnotationPresent(RolesAllowed.class)){
        RolesAllowed rolesAnnotation = method.getAnnotation(RolesAllowed.class);
        Set<String> rolesSet = new HashSet<String (Arrays.asList(rolesAnnotation.value()));
        return rolesSet.contains("remote");
    }
    return false;
}