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

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

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


我正在使用Guice for DI。


我必须编写两个方法拦截器吗?实际工作正在@MapException中完成
如果是,那么如何从@MapExceptions拦截器invoke方法调用@MapException拦截器invoke方法?我不想重复代码。
我的@MapException拦截器如下所示


公共类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;
    }
}


}

我目前正在使用以下绑定

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


这个可以吗?还是我可以改善?

谢谢 !

最佳答案

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

09-10 03:58
查看更多