Guice中的嵌套注解方法拦截
Nested annotations method interception in Guice
我搜索了很多,但找不到任何有用的东西。
问题:
我创建了自定义注释,例如:
@MapExceptions(value = {
@MapException(sources = {IllegalArgumentException.class, RuntimeException.class}, destination = BadRequestException.class),
@MapException(sources = {RuntimeException.class}, destination = BadRequestException.class)
})
我正在为 DI 使用 Guice。
- 我必须写两个方法拦截器吗?实际工作在@MapException
中完成
- 如果是,那么如何从@MapExceptions 拦截器调用方法中调用@MapException 拦截器调用方法?我不想重复代码。
- 我的@MapException 拦截器如下所示
public class 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) 编写了拦截器,它完成了所有工作。
我搜索了很多,但找不到任何有用的东西。
问题: 我创建了自定义注释,例如:
@MapExceptions(value = {
@MapException(sources = {IllegalArgumentException.class, RuntimeException.class}, destination = BadRequestException.class),
@MapException(sources = {RuntimeException.class}, destination = BadRequestException.class)
})
我正在为 DI 使用 Guice。
- 我必须写两个方法拦截器吗?实际工作在@MapException 中完成
- 如果是,那么如何从@MapExceptions 拦截器调用方法中调用@MapException 拦截器调用方法?我不想重复代码。
- 我的@MapException 拦截器如下所示
public class 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) 编写了拦截器,它完成了所有工作。