Annotazione Java non riconosciuto

voti
0

Ho un'applicazione di avvio molla con @PreAuthorize per i controlli di sicurezza. La convalida lavora nella mia domanda se inizio eseguendo il compito bootRun Gradle. Se inizio l'applicazione dalla Primavera Tool Suite (con configurazione di esecuzione standard), i controlli di sicurezza non funzionano.

Credo che il problema è che l'annotazione pre-autorizzare non viene riconosciuta quando partendo da STS. Posso riprodurlo con una semplice applicazione di avvio di primavera Gradle utilizzando la stessa gerarchia di ereditarietà come la mia vera applicazione.

  • DemoEntity estende BaseDemo che si estende AbstractBaseEntity.
  • DemoService estende AbstractService che implementa IEntityService
  • DemoService attrezzi IDemoService che si estende IEntityService.

Ecco il codice in questione:

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:

  • Ho annotato il metodo creare sul DemoService di classe.
  • Questo metodo esegue l'override del metodo di creare dei AbstractService e implementa il metodo che viene dichiarato in IEntityService.

Stampo i metodi e le loro annotazioni con il codice seguente.

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

Quando si inizia con il compito bootRun Gradle, ottengo il seguente risultato:

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

L'annotazione è lì per ogni metodo nella gerarchia di ereditarietà. Quando si avvia l'applicazione dal STS, il risultato è:

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

Credo che questa demo riproduce il motivo per il mio problema in applicazione reale. Ho creato il progetto con molla initializr usando Primavera Boot 2.2.0, Java 11 e non avendo altra dipendenza.

Qualcuno può dirmi, perché STS produce altri risultati che correre bootRun? Devo aggiungere un parametro o l'impostazione nei miei STS in modo che si comporta allo stesso modo di bootRun?

È pubblicato 24/10/2019 alle 12:55
fonte dall'utente
In altre lingue...                            

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