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