【问题标题】:How to work with Resteasy interceptor with Undertow如何使用带有 Undertow 的 Resteasy 拦截器
【发布时间】:2017-05-17 22:49:52
【问题描述】:

Resteasy 拦截器实现了 ContainerRequestFilter。但是undertow DeploymentInfo 的addFilter 需要Filter Class 需要实现。

如何解决这个问题?我们必须只写为过滤器?

如果是这种情况,我需要从普通的 servlet 上下文中了解 java.lang.reflect.Method 吗?

【问题讨论】:

  • 你想实现什么样的过滤器?

标签: resteasy undertow


【解决方案1】:

ContainerRequestFilter 是一个 JAX-RS 组件,必须像注册任何其他 JAX-RS 提供程序一样进行注册(即扫描 @Provider 类注释,覆盖 JAX-的 getClasses 方法) RS 应用程序,将其添加到您的 web.xml 上下文参数等...)

Undertow DeploymentInfo 类中的 addFilter 方法具有完全不同的含义,因为它允许您将 Servlet 过滤器 添加到 Deployment。

要解决您的问题,请使用 Resteasy 注册您的 ContainerRequestFilter,或使用 Servlet Filter 实现相同的逻辑并通过 Undertow 的 DeploymentInfo 进行注册。

【讨论】:

    【解决方案2】:

    第 1 步:假设您知道如何创建一个 Rest Service 应用程序并且您有一个这样的类

    public class App extends javax.ws.rs.core.Application{...//set a list of services here using 
    @Override
    public Set<Object> getSingletons(){
        final Set<Object> objects=new HashSet<>();
        objects.add(new MyService()));
        return objects;
    }
    

    }

    第 2 步: 创建一个标准的过滤器类。这里没什么特别的。

    public class MyFilter implements Filter {
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
     
            filterChain.doFilter(servletRequest,servletResponse);
        }
        // overwrite doInit ass well
    }
    

    第 3 步:部署它

        FilterInfo filterInfo = new FilterInfo("MyFilter", MyFilter.class);
        ResteasyDeployment deployment = new ResteasyDeployment();
        deployment.setApplication(new App());
    
        UndertowJaxrsServer restServer = new UndertowJaxrsServer();
        DeploymentInfo deploymentWrapper = restServer.undertowDeployment(deployment);
        deploymentWrapper.setDeploymentName("mysite.myext");
        deploymentWrapper.setClassLoader(this.getClass().getClassLoader());
        deploymentWrapper.setContextPath("/");
        deploymentWrapper.addFilter(filterInfo);
        deploymentWrapper.addFilterServletNameMapping("MyFilter","ResteasyServlet", DispatcherType.REQUEST);//Name of servlet is hardcoded in UndertowJaxrsServer class
    
    
        try {
            
            Undertow.Builder restServerBuilder = Undertow.builder()
                    .addHttpListener(8080, "0.0.0.0").setWorkerThreads(200);
            restServer.start(restServerBuilder);
            restServer.deploy(deploymentWrapper);
            
        } catch (Exception ex) {
            logger.error("We got a problem {}", ExceptionUtils.getRootCauseMessage(ex),ex);
            throw ex;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-25
      • 2022-10-15
      • 1970-01-01
      • 2022-01-17
      • 2021-06-16
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      相关资源
      最近更新 更多