Как обернуть метод с помощью try-catch по аннотации? - PullRequest
0 голосов
/ 22 октября 2018

Если исключение следует игнорировать внутри вызова метода, можно написать, например, следующее:

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 голосов
/ 22 октября 2018

Вот способ сделать это с AspectJ .

Прежде всего, определите аннотацию уровня метода.

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

}

Затем определите около аспект для аннотации.

@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) {
    // ...
}

Вы также можете проверить параметрыаннотация с использованием API ProceedingJoinPoint для игнорирования только тех исключений, которые вы хотели бы игнорировать.

...