Не считываются аннотации над имплементированными методами
Написал аннотацию по которой при создании бина будет добавляться прокси для отмеченных этой аннотацией классов (Прокси отправляет запрос со статистикой запроса на указанный в аннотации эндпоинт). Так же имеется вторая аннотация(как флаг) т.к. не для всех методов необходима эта отправка.
@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
что бы считывать аннотации из имплементированных методов?