Пользовательская аннотация Java с помощью Spring Boot - PullRequest
0 голосов
/ 12 сентября 2018

Я создаю 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);

значение действия равно нулю.

Не могу понять, почему. Может ли кто-нибудь помочь, пожалуйста?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...