исключение некоторых полей/параметров из логгирования через Spring AOP

У меня в spring проекте есть такой класс aspect для логгирования

@Aspect
@Component
public class BaseLoggingAspect {

    private static final Logger logger = LoggerFactory.getLogger(BaseLoggingAspect.class);

    @Target({ ElementType.FIELD, ElementType.PARAMETER })
    public @interface NonLoggingField {
        
    }
    
    @Pointcut("execution(public * *(..))")
    private void allPublicMethods() {

    }

    @Pointcut("within(img.imaginary.service.*)")
    private void inServices() {

    }

    @Pointcut("within(img.imaginary.dao.*)")
    private void inDao() {

    }

    @Before("allPublicMethods() && inServices() || inDao()")
    public void logBeforeCall(JoinPoint joinPoint) {
        if (logger.isDebugEnabled()) {
            logger.debug("begin method {} in {} class with arguments: {}", joinPoint.getSignature().getName(),
                    joinPoint.getTarget().getClass().getSimpleName(), joinPoint.getArgs());
          
        }
    }
}

этот аспект просто ловит все публичные методы service и dao слоев и выводит в лог в начале выполнения имя метода, имя класса, и масиив значений аргументов метода

в этом аспекте я создал аннотцию NonLoggingField которую хочу применять к некоторым полям классов тех объектов, которые могу передаваться в параметры этих логгируемых методов, например такой:

public class User {
     @NonLoggingField
     public String userEmail;
     public name;
     
     public User(String userEmail, String name) {
        this.userEmail = userEmail;
        this.name= name;
     }
     
     public String tiString() {
        return String.format("user name: %s and his email: %s", name, userEmail);
     }
}

дело в том, что в лог будут писаться такие объекты через его метод toString, но нужно, чтобы email каким-то образом не попадал в лог, используя аннотацию notLoggingField, пока в голове есть мысли делать через рефлексию, но ясности нет, как это сделать без овер трудного кода с использованием рефлексии, тем более учитывая, что объекты могут иметь внутри еще объекты других типов, в которых могут быть такие же поля с аннотациями или коллекции с объектами с такими полями. возможно библиотека aspectJ может помочь, но не могу найти таких механизмов в ней. Прошу помочь что-то придумать


Ответы (0 шт):