Не считываются аннотации над имплементированными методами

Написал аннотацию по которой при создании бина будет добавляться прокси для отмеченных этой аннотацией классов (Прокси отправляет запрос со статистикой запроса на указанный в аннотации эндпоинт). Так же имеется вторая аннотация(как флаг) т.к. не для всех методов необходима эта отправка.

@Component
public class SendToEndpointBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean.getClass().isAnnotationPresent(SendToEndpoint.class)) {
            return Proxy.newProxyInstance(bean.getClass().getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandler() {
                @Override
                public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                    if (method.isAnnotationPresent(SendStatistic.class)) {
                        try {
                            HttpServletRequest httpServletRequest = getRequest(objects);
                            sendHit(httpServletRequest, bean);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    return method.invoke(bean, objects);
                }
            });
        }
        return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
    }


    private HttpServletRequest getRequest(Object[] objects) {
        for (Object o: objects) {
            if(o.getClass() == RequestFacade.class) {
                return (HttpServletRequest) o;
            }
        }
        return null;
    }

    private void sendHit(HttpServletRequest request, Object bean) {
        EndpointSender endpointSender = new EndpointSender(
                bean.getClass().getAnnotation(SendToEndpoint.class).path());
        HitDto hit = new HitDto();
        hit.setApp(bean.getClass().getAnnotation(SendToEndpoint.class).app());
        hit.setUri(request.getRequestURI());
        hit.setIp(request.getRemoteAddr());
        hit.setTimestamp(LocalDateTime.now());
        endpointSender.sendRequest(hit);
    }
}

Сам класс является имплементацией интерфейса.

@Service
public interface UserService {
    NewUserRequest createNewUser(NewUserRequest userDto, HttpServletRequest request);
    ResponseEntity<?> getUserById(Long userId);
    ResponseEntity<?> removeUserById(Long userId);
}

Класс:

@Service
@RequiredArgsConstructor
@SendToEndpoint(path = "https://localhost:8080", app = "ewm-main-service") **<-аннотация 1**
public class UserServiceImpl implements UserService {
    private final UserRepository userRepository;

    @Override
    @SendStatistic  **<-аннотация 2**
    public NewUserRequest createNewUser(NewUserRequest user, HttpServletRequest request) {
        UserEntity userEntity = new UserEntity();
        userEntity.setEmail(user.getEmail());
        userEntity.setName(user.getName());
        userRepository.save(userEntity);
        return user;
    }

    @Override
    public ResponseEntity<?> getUserById(Long userId) {
        return null;
    }

    @Override
    public ResponseEntity<?> removeUserById(Long userId) {
        return null;
    }
}

Но столкнулся с проблемой, что при вызове метода не отрабатывает проверка на наличие аннотации над методом, если аннотация SendStatistic установлена в UserServiceImpl. Если установить аннотацию в интерфейсе UserService все отрабатывает. Как исправить BeanPostProcessor что бы считывать аннотации из имплементированных методов?


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