Guice中的嵌套注释方法拦截

时间:2016-03-21 12:16:01

标签: java guice interceptor

我搜索了很多,但找不到任何有用的东西。

问题: 我创建了自定义注释,如:

@MapExceptions(value = {
        @MapException(sources = {IllegalArgumentException.class, RuntimeException.class}, destination = BadRequestException.class),
        @MapException(sources = {RuntimeException.class}, destination = BadRequestException.class)
})

我正在使用Guice进行DI。

  1. 我是否必须编写两个方法拦截器?实际工作是在@MapException
  2. 中完成的
  3. 如果是,那么如何从@MapExceptions拦截器调用方法调用@MapException拦截器调用方法?我不想复制代码。
  4. 我的@MapException拦截器如下所示
  5. 公共类MapExceptionInterceptor实现MethodInterceptor {

    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        try {
            return invocation.proceed();
        } catch (Exception actualException) {
            Method method = invocation.getMethod();
            Annotation[] annotations = method.getDeclaredAnnotations();
            for (Annotation annotation : annotations) {
                if (annotation instanceof MapException) {
                    MapException mapException = (MapException) annotation;
                    Class<? extends Throwable> destinationClass = mapException.destination();
                    Class<? extends Throwable>[] sourceClasses = mapException.sources();
                    for (Class sourceExceptionClass : sourceClasses) {
                        if (actualException.getClass().isInstance(sourceExceptionClass)) {
                            Constructor ctr = destinationClass.getConstructor(String.class);
                            throw (Throwable) ctr.newInstance(actualException.getMessage());
                        }
                    }
                }
            }
            throw actualException;
        }
    }
    

    }

    我目前正在使用以下Binding

    bindInterceptor(Matchers.any(), Matchers.annotatedWith(MapException.class), new MapExceptionInterceptor());
    

    这可以吗?或者我可以改进?

    谢谢!

1 个答案:

答案 0 :(得分:0)

因此,内部注释只是一个数据包。 为了解决这个问题,我为外部注释(MapExceptions)编写了拦截器,它完成了所有的工作。