Пользовательская Java аннотация, которая вызывает REST API - PullRequest
0 голосов
/ 12 февраля 2020

Я хотел бы создать аннотацию Java @Ping, которая отправляет запрос POST в REST API, который я развернул в контейнере Docker.

Пока что я создал эту аннотацию :

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Ping {
    String endpoint();
}

Как видите, я бы хотел, чтобы эта аннотация основывалась на методах. Этот метод позволит мне присвоить статус (доступный или недоступный) другим моим службам.

Я также хотел бы сохранить этот код как артефакт Maven в своем собственном репо, где я добавлю еще пару аннотаций , чтобы я мог использовать его в других своих службах.

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

Из того, что я понимаю, теперь мне нужен обработчик, содержащий logi c (то есть отправляющий запрос POST в мой API), но я не уверен, как это сделать. Есть ли шанс, что вы можете помочь мне начать это? Является ли аннотация хорошей идеей сделать что-то подобное?

Спасибо!

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Создайте аннотацию уровня метода и используйте AOP, чтобы написать лог c, который будет вызывать ваши остальные API

@Around("execution(@Ping * *(..))")
public void entr(ProceedingJoinPoint joinPoint) throws Throwable {
 System.out.println("before method");
 joinPoint.proceed();
 System.out.println("after method");
}
0 голосов
/ 17 февраля 2020

Чтобы добавить ответ @Urvil Joshi, учитывая, что я не хочу добавлять зависимость Spring, я создал файл PingAspect.aj с таким содержанием:

public aspect PingAspect {

    pointcut hasPingAnnotation(Ping ping): @annotation(ping);

    pointcut execute() : execution(* * (..));

    Object around(Ping ping) : execute() && hasPingAnnotation(ping) {
        System.out.println("Before method execution");
        String endpoint = ping.endpoint();
        System.out.println("Endpoint = " + endpoint);
        Object result = proceed(ping);
        System.out.println("After");
        return result;
    }
}

Прекрасно работает с aj c компилятор! Надеюсь, что это может помочь

...