Java-аннотация не распознана - PullRequest
1 голос
/ 24 октября 2019

У меня есть приложение весенней загрузки, использующее @PreAuthorize для проверок безопасности. Проверка работает в моем приложении, если я запускаю его, выполняя задание bootRun. Если я запускаю приложение из Spring Tool Suite (используя стандартную конфигурацию запуска), проверки безопасности не работают.

Мне кажется, проблема в том, что аннотация PreAuthorize не распознается при запуске из STS. Я могу воспроизвести его с помощью простого загрузочного весеннего приложения, используя ту же иерархию наследования, что и мое реальное приложение.

  • «DemoEntity» расширяет «BaseDemo», что расширяет «AbstractBaseEntity».
  • »DemoService »расширяет« AbstractService », который реализует« IEntityService »
  • « DemoService »реализует« IDemoService », который расширяет« IEntityService ».

Вот соответствующий код:

public class DemoEntity extends BaseDemo {}
public class BaseDemo extends AbstractBaseEntity {}
public abstract class AbstractBaseEntity {}

public class DemoService extends AbstractService<BaseDemo, DemoEntity> implements IDemoService {
    @Override
    @DemoAnnotation
    public void create(DemoEntity entity) {}
}

public interface IDemoService extends IEntityService<DemoEntity> {}

abstract class AbstractService<B extends AbstractBaseEntity, E extends B> implements IEntityService<E> {
    @Override
    public void create(E entity) {
        throw new UnsupportedOperationException();
    }
}

public interface IEntityService<E> {
    void create(E entity);
}

@Retention(RetentionPolicy.RUNTIME)
public @interface DemoAnnotation {}

Примечание:

  • Я аннотировал метод "create" для класса DemoService.
  • Этот метод переопределяет метод "create" в AbstractService и реализует метод, который являетсяобъявлено в IEntityService.

Я печатаю методы и их аннотации с помощью следующего кода.

@SpringBootApplication
public class AnnotationDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(AnnotationDemoApplication.class, args);

        for (final Method method : DemoService.class.getMethods()) {
            if (method.getName().contains("create")) {
                System.out.println("Method: " + method.toString());
                final Annotation[] annotations = method.getAnnotations();
                System.out.println("  #Annotations: " + annotations.length);
                for (final Annotation annotation : annotations) {
                    System.out.println("  Annotation: " + annotation.toString());
                }
                System.out.println();
            }
        }
    }
}

При запуске с загрузочной задачи bootRun я получаю следующий результат:

Method: public void com.example.annotationdemo.DemoService.create(java.lang.Object)
  #Annotations: 1
  Annotation: @com.example.annotationdemo.DemoAnnotation()

Method: public void com.example.annotationdemo.DemoService.create(com.example.annotationdemo.AbstractBaseEntity)
  #Annotations: 1
  Annotation: @com.example.annotationdemo.DemoAnnotation()

Method: public void com.example.annotationdemo.DemoService.create(com.example.annotationdemo.DemoEntity)
  #Annotations: 1
  Annotation: @com.example.annotationdemo.DemoAnnotation()

Аннотация есть для каждого метода в иерархии наследования. При запуске приложения из STS, результат:

Method: public void com.example.annotationdemo.DemoService.create(com.example.annotationdemo.DemoEntity)
  #Annotations: 1
  Annotation: @com.example.annotationdemo.DemoAnnotation()

Method: public void com.example.annotationdemo.DemoService.create(com.example.annotationdemo.AbstractBaseEntity)
  #Annotations: 0

Method: public void com.example.annotationdemo.AbstractService.create(java.lang.Object)
  #Annotations: 0

Я думаю, что эта демонстрация воспроизводит причину моей проблемы в реальном приложении. Я создал проект с помощью spring initializr, используя Spring Boot 2.2.0, Java 11 и не имея других зависимостей.

Кто-нибудь может мне сказать, почему STS дает другие результаты, чем запуск bootRun? Нужно ли добавлять параметр или параметр в мой STS, чтобы он вел себя так же, как bootRun?

...