如何使用 Resteasy 拦截器与 Undertow



Resteasy 拦截器实现了 ContainerRequestFilter。但是底层部署信息的addFilter需要过滤器类需要实现。

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

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

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

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

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

第 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;
    }

相关内容

  • 没有找到相关文章

最新更新