исключение некоторых полей/параметров из логгирования через 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 может помочь, но не могу найти таких механизмов в ней. Прошу помочь что-то придумать