2015-12-30 79 views
1

我在dropwizard中構建了一個通用的異常處理程序。我想提供自定義的註釋作爲庫的一部分,它將調用時例外方法提出了handleException方法(方法包含註釋)使用自定義註釋的調用方法 - JAVA

詳情: 自定義註釋@ExceptionHandler

@Target(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface ExceptionHandler{ 
    Class<? extends Throwable>[] exception() default {}; 
} 

有一個處理方法handleException(Exception, Request),類ExceptionHandlerImpl

現在有每當EXC1EXC2由法doPerformOperation提出有法註釋

@ExceptionHandler(exception = {EXC1,EXC2}) 
Response doPerformOperation(Request) throws EXC1,EXC2,EXC3{} 

現在商務艙,我想調用handleException方法。

我嘗試閱讀AOP(AspectJ),Reflection,但無法找出執行此操作的最佳最佳方式。

+0

無論如何,這個異常是否應該被記錄並升級到調用堆棧,或者您是否期望異常被捕獲並且問題「修復」?我在問,因爲如果你想修復它,你需要生成一個'Response'來由你的方法返回。我建議的解決方案取決於你的答案。 – kriegaex

+1

標準JAX-RS異常映射器(https://jersey.java.net/documentation/latest/representations.html#d0e6653)會更明智嗎?並根據異常類型提供異常處理程序? –

+0

@ kriegaex:我不需要任何返回值。我已經使用aspectjrt解決了這個問題。 –

回答

1

我已經使用aspectj解決了這個問題。我創建了接口

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
public @interface HandleExceptionSet { 
    HandleException[] exceptionSet(); 
} 

其中HandleException是另一個註釋。這是爲了允許一些例外。

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.ANNOTATION_TYPE) 
public @interface HandleException { 
    Class<? extends CustomException> exception() default CustomException.class; 
} 

現在我有一個ExceptionHandler類,它有處理程序。爲了將方法綁定到這個註解,我在模塊中使用下面的配置。

bindInterceptor(Matchers.any(), Matchers.annotatedWith(HandleExceptionSet.class), new ExceptionHandler()); 

我在類中使用這個註釋,下面的代碼片段。

@HandleExceptionSet(exceptionSet = { 
     @HandleException(exception = ArithmeticException.class), 
     @HandleException(exception = NullPointerException.class), 
     @HandleException(exception = EntityNotFoundException.class) 
}) 
public void method()throws Throwable { 
    throw new EntityNotFoundException("EVENT1", "ERR1", "Entity Not Found", "Right", "Wrong"); 
} 

這現在正在爲我工​​作。不確定,如果這是最好的方法。

有沒有更好的方法來實現這個目標?