Anotação Java não é reconhecido

votos
0

Eu tenho um aplicativo de inicialização primavera usando @PreAuthorize para verificações de segurança. A validação funciona na minha candidatura se eu iniciá-lo, executando o bootRun tarefa Gradle. Se eu iniciar o aplicativo a partir da Primavera Tool Suite (usando configuração de execução padrão), as verificações de segurança não funcionam.

Eu acho que o problema é que a anotação preauthorize não é reconhecido quando a partir de STS. I pode reproduzi-lo com um aplicativo de inicialização primavera Gradle simples usando a mesma hierarquia de herança como a minha aplicação real.

  • DemoEntity estende BaseDemo que se estende AbstractBaseEntity.
  • DemoService estende AbstractService que implementa IEntityService
  • DemoService instrumentos IDemoService que se estende IEntityService.

Aqui está o código relevante:

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 {}

Nota:

  • I anotado o método de criar na DemoService classe.
  • Esse método substitui o método criar de AbstractService e implementa o método que é declarado na IEntityService.

I imprimir os métodos e as suas anotações com o seguinte código.

@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();
            }
        }
    }
}

Ao iniciar com o bootRun tarefa Gradle, eu recebo o seguinte resultado:

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()

A anotação é lá para cada método na hierarquia de herança. Ao iniciar a aplicação de STS, o resultado é:

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

Eu acho que esta demonstração reproduz a razão para o meu problema na aplicação real. Eu criei o projeto com mola initializr usando Spring Bota 2.2.0, Java 11 e não tendo outra dependência.

Alguém pode me dizer, por STS produz outros resultados do que correr bootRun? Eu preciso adicionar um parâmetro ou configuração em meus STS para que ele se comporta da mesma forma que bootRun?

Publicado 24/10/2019 em 12:55
fonte usuário
Em outras línguas...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more