Я создаю SDK, который может иметь доступ к коду клиента и найти значения, связанные с аннотациями.
У меня есть две пользовательских аннотации:
@Constraint(validatedBy = CustomizationValidator.class)
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Customization {
String id();
String state();
}
И
@Constraint(validatedBy = ActionValidator.class)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Action {
String id();
String[] customizationId();
}
Код клиента выглядит следующим образом:
@Service
public class ClientService {
@Customization(id = "test", state = "SomeState")
public String method2(final String id) {
return "Doing Something in method 2 " + id;
}
}
и
@Slf4j
@Component
@Action(id = "TestAction", customizationId = "test")
public class ActionConfigImpl implements ActionConfiguration<String> {
@Override
public String getName() {
return "ActionConfigImpl";
}
@Override
public String execute(final Map map) {
log.info("Map in Execute: {}", map);
log.info("In Execute of ActionConfigImpl");
return "Some";
}
@Override
public void destroy() throws Exception {
log.info("In destroy");
}
@Override
public void afterPropertiesSet() throws Exception {
log.info("In afterPropertiesSet");
}
}
Процессор аннотаций имеет что-то вроде приведенного ниже кода для поиска значений аннотаций:
final Class<?> aClass = actionConfiguration.getClass();
final Action action = aClass.getAnnotation(Action.class);
Приведенный выше код может найти значение action, если actionConfiguration является объектом (созданным Spring) ActionConfigImpl для определения приведенного выше класса.
Но если у меня есть вложенная аннотация с @Action и @Customization в том же классе, что и ниже, то она не работает.
@Slf4j
@Component
@Action(id = "TestAction1", customizationId = "testCP1")
public class ActionConfigImpl implements ActionConfiguration<String> {
@Override
public String getName() {
return "ActionConfigImpl";
}
@Override
@Customization(id = "testCP2", state = "sampleState1")
public String execute(final Map map) {
log.info("Map in Execute: {}", map);
log.info("In Execute of ActionConfigImpl");
return "Some";
}
@Override
public void destroy() throws Exception {
log.info("In destroy");
}
@Override
public void afterPropertiesSet() throws Exception {
log.info("In afterPropertiesSet");
}
}
Для вышеуказанного кода
final Class<?> aClass = actionConfiguration.getClass();
final Action action = aClass.getAnnotation(Action.class);
значение действия равно нулю.
Не могу понять, почему. Может ли кто-нибудь помочь, пожалуйста?