vertx结合Resteasy实现注解拦截器
- 在Verticle中创建JAX-RS controller deployment对象并开启
VertxResteasyDeployment deployment = new VertxResteasyDeployment();
deployment.start();
- 将DynamicFeature对象注册到Provider中
deployment.getProviderFactory().register(MyDynamicFeature.class);
deployment.getRegistry().addPerInstanceResource(MyResource.class);
其他Resource注册deployment.getRegistry().addPerInstanceResource时会调用MyDynamicFeature的configure方法,并可在configure的参数resourceInfo中获取Resource的相关信息
- MyDynamicFeature实现如下
public class MyDynamicFeature implements DynamicFeature {
@Override
public void configure(ResourceInfo resourceInfo, FeatureContext featureContext) {
if (null!=resourceInfo.getResourceMethod()&&
//可拦截resource类中带有MyAnnotation注解的方法,然后将相关拦截器注册到featureContext中,当调用加注解的方法时,从而进入拦截器里进行处理
null != resourceInfo.getResourceMethod().getDeclaredAnnotation(MyAnnotation.class)){
featureContext.register(new MyFilter(resourceInfo));
}
}
}
- Myfilter拦截器如下
public void filter(ContainerRequestContext containerRequestContext) {
/*
do something
*/
//中断处理并返回相应
//若无此处理则继续执行Resource方法
containerRequestContext.abortWith(Response...);
}
- 自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
String value();
}
- Resource类
@POST
@MyAnnotation("annotation")
@Path("/aaa")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response MyResource(){
/*
do something
*/
}