如何使用按批注尝试包装的方法?

时间:2018-10-22 07:59:25

标签: java spring try-catch

如果在方法调用中应忽略异常,则将编写例如以下内容:

public void addEntryIfPresent(String key, Dto dto) {
   try {
        Map<String, Object> row = database.queryForMap(key);
        dto.entry.put(row);
   } catch (EmptyResultDataAccessException e) {}
}

我正在尝试编写具有相同效果的自定义spring注释,但是可以仅将其应用于方法标头。看起来可能类似于以下内容:

@IgnoreException(EmptyResultDataAccessException.class) //this annotation does not exist
public void addEntryIfPresent(String key, Dto dto) {
   Map<String, Object> row = database.queryForMap(key);
   dto.entry.put(row);
}

如何创建这样的注释?

1 个答案:

答案 0 :(得分:3)

这是使用 AspectJ 的一种方法。

首先,定义一个方法级别的注释。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface IgnoreRuntimeException{

}

然后,为注释定义一个 around 方面。

@Component
@Aspect
public class ExceptionHandlingAdvice {

    @Around("@annotation(com.yourpackage.IgnoreRuntimeException) && execution(* *(..))")
    public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
        Object returnObject = null;
        // do something before the invocation
        try {
            // invoke method
            returnObject = joinPoint.proceed();
            // do something with the returned object
            return returnObject;
        } catch (Exception e) {
            // do something with the exception
        }
    }

}

然后您可以在方法顶部应用注释以忽略异常。

@IgnoreRuntimeException
public void addEntryIfPresent(String key, Dto dto) {
    // ...
}

您还可以使用ProceedingJoinPoint的api检查批注的参数,以仅忽略您要忽略的异常。