Java Annotation non reconnu

voix
0

J'ai une application de démarrage de ressort à l'aide @PreAuthorize pour les contrôles de sécurité. La validation fonctionne dans ma demande si je commence par l'exécution de la tâche bootRun gradle. Si je commence l'application de la Suite Spring Tool (en utilisant la configuration d'exécution standard), les contrôles de sécurité ne fonctionnent pas.

Je pense que le problème est que l'annotation est pré-autorisation ne reconnaît pas lors du démarrage de STS. Je peux le reproduire avec une simple application de démarrage de printemps gradle en utilisant la même hiérarchie d'héritage que mon application réelle.

  • DemoEntity étend BaseDemo qui étend AbstractBaseEntity.
  • « DemoService » étend « AbstractService » qui met en oeuvre « IEntityService »
  • DemoService outils IDemoService qui étend IEntityService.

Voici le code correspondant:

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

Remarque:

  • J'annotés la méthode « créer » sur la DemoService de classe.
  • Cette méthode remplace la méthode de AbstractService et met en œuvre la méthode « créer » qui est déclarée sur IEntityService.

Imprimer les méthodes et leurs annotations avec le code suivant.

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

Lors du démarrage de la tâche bootRun gradle, je reçois le résultat suivant:

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'annotation est là pour chaque méthode dans la hiérarchie d'héritage. Lors du démarrage de l'application de STS, le résultat est le suivant:

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

Je pense que cette démo reproduit la raison de mon problème dans l'application réelle. J'ai créé le projet avec ressort initializr avec Spring Boot 2.2.0, Java 11 et ayant aucune autre dépendance.

Quelqu'un peut-il me dire, pourquoi STS produit d'autres résultats que la course bootRun? Ai-je besoin d'ajouter un paramètre ou réglage dans mes STS afin qu'il se comporte de la même manière que bootRun?

Créé 24/10/2019 à 12:55
source utilisateur
Dans d'autres langues...                            

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