У меня есть приложение весенней загрузки, использующее @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?