【问题标题】:JAX-RS - Creating filter extending ContainerRequestFilterJAX-RS - 创建扩展 ContainerRequestFilter 的过滤器
【发布时间】:2017-01-17 08:25:40
【问题描述】:

我的 TomEE Plume 7.0.2 有问题。

我以这种方式创建了一个过滤器:

package com.gfp.rest.providers;

import java.io.IOException;

import javax.annotation.Priority;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.PreMatching;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.Provider;

@PreMatching
@Provider
@Priority(value = 1)
public class AuthenticationFilter implements ContainerRequestFilter
{
    public AuthenticationFilter()
    {
        System.out.println("AuthenticationFilter.AuthenticationFilter()");
    }

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException
    {
        System.out.println("AuthenticationFilter.filter()");
        String token = requestContext.getHeaderString("token");

        ResponseBuilder responseBuilder = null;
        Response response = null;

        // check if token is empty
        if (token.isEmpty()) {
            responseBuilder = Response.serverError();
            response = responseBuilder.status(Status.UNAUTHORIZED).build();
            requestContext.abortWith(response);
        }
    }
}

这是我的休息申请:

    package com.gfp.rest;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("api/v1")
public class RestApplication extends Application
{
}

问题是:过滤器似乎没有被调用。我已经阅读了很多文档和许多其他帖子,但我找不到任何解决方案。有什么我错过的特别之处吗?

非常感谢!

【问题讨论】:

    标签: jakarta-ee filter jax-rs apache-tomee tomee-7


    【解决方案1】:

    试试这个

    package com.gfp.rest;
    
    import javax.ws.rs.ApplicationPath;
    import javax.ws.rs.core.Application;
    
    @ApplicationPath("api/v1")
    public class RestApplication extends Application
    {
    public Set<Class<?>> getClasses() {
            return getRestClasses();
        }
    
        private Set<Class<?>> getRestClasses() {
            Set<Class<?>> resources = new java.util.HashSet<Class<?>>();        
            resources.add(AuthenticationFilter.class);
            return resources;    
        }
    }
    

    对于 Jersey 2.x,您可能还需要使用 org.glassfish.jersey.servlet.ServletContainer 作为 web.xml 中的 servlet 容器。

    【讨论】:

    • 如果您这样做,那么您还需要注册所有资源类。 应该 可以使用空的 Application 类,因为它被指定为触发对 @Path@Provider 类的类路径扫描。添加类后,您将禁用类路径扫描并需要自己注册所有内容。
    • 得到如下 NullPointerException。是否有任何“自动方式”可以使其与 TomEE 一起使用?
    【解决方案2】:

    这取决于您的配置(我认为是 openejb-jar.xml 和系统属性),因为它应该开箱即用(https://github.com/apache/tomee/blob/41cb392c6e3dc63d6792eae88e90c33743255212/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/CDIProviderContainerRequestFilterTest.java 仅此而已)

    替代方法是在类中注册过滤器,如 Rahul 的回答(但请不要做任何与球衣相关的事情,因为 TomEE 不使用球衣它会失败并且只会添加混乱)或者只是在 openejb-jar 中配置它.xml。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-14
      • 2018-01-15
      • 1970-01-01
      相关资源
      最近更新 更多