0

First of all, I am not 100% sure if my code is correct, since this is the first time I am ever using Aspect in Spring, so I will be happy if you point out any errors.

First a little background. I have an application that uses a logging method that returns a stacktrace, an error message and the priority of that error (Low, Medium, Critical). In my manager it looks like this:

public UUID createErrorLogEntry(UUID userId, Throwable throwable, ErrorLogEntryPriorityType priority, String errorMessage) {
    ErrorLogEntryEntity errorLogEntryEntity = new ErrorLogEntryEntity(priority, errorMessage);
    errorLogEntryEntity.setNew(true);
    errorLogEntryEntity.setId(UUID.randomUUID());
    if (throwable != null)
        errorLogEntryEntity.setStackTrace(ExceptionUtils.getStackTrace(throwable));
    errorLogEntryEntity.setCreationDateTime(DateTimeUtils.nowUtc());
    errorLogEntryEntity.setCreationUserId(userId);
    errorLogEntryEntity.setChangedDateTime(errorLogEntryEntity.getCreationDateTime());
    errorLogEntryEntity.setChangedUserId(userId);
    errorLogEntryEntity.setPriority(errorLogEntryEntity.getPriority());
    errorLogEntryEntity.setDone(errorLogEntryEntity.isDone());
    errorLogEntryEntity.setMessage(errorLogEntryEntity.getMessage());
    errorLogEntryRepository.save(errorLogEntryEntity);
    return errorLogEntryEntity.getId();
}

Up until now I have been manually inserting this into try-blocks on every class in the system, which is very tedious. So I wanted to use Aspect and only target async and scheduled jobs, so I made this class:

@Aspect
@Component
public class errorEntryLogger {

    @Autowired
    private ErrorLogEntryManager errorLogEntryManager;

    @Around("@annotation(org.springframework.scheduling.annotation.Scheduled) && @annotation(org.springframework.scheduling.annotation.Async)")
    public Object createErrorEntryLogger(ProceedingJoinPoint pjp) throws Throwable {
        try {
            pjp.proceed();
        } catch (Exception e) {
            errorLogEntryManager.createErrorLogEntry(null, e.fillInStackTrace(), ErrorLogEntryPriorityType.LOW, "An error occurred");
        }
        return createErrorEntryLogger(pjp);
    }
}

But here is the issue. Doing it this way, all error logs will have a priority of "Low" and a generic error message. But what if I have classes where I want to set the priority higher or create more detailed error messages? How would I deal with these while using aspect?

Again, if there are better ways to write this code, let me know.

1
  • you can create your own annotation, and pass the priority as a parameter to it Commented Mar 15, 2023 at 7:40

1 Answer 1

1

As @Stultuske said in his comment you can create a custom @Priority annotation.

You can create the annotation as follows:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Priority {
    public String value() default "LOW";
}

Then you can read the value of this annotation as follows:

public Object createErrorEntryLogger(final ProceedingJoinPoint proceedingJoinPoint ) throws Throwable {
    final MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint .getSignature();
    final Method method = methodSignature.getMethod();
    final Priority priority = method.getAnnotation(Priority.class);
    // Do whatever you want with priority.value()
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.