Java annotatie niet herkend

stemmen
0

Ik heb een veer boot applicatie met behulp van @PreAuthorize voor veiligheidscontroles. De validatie werkt in mijn toepassing als ik start deze door het uitvoeren van de gradle taak bootRun. Als ik het verzoek van de Lente Tool Suite (met behulp van standaard run configuratie) aanslaat, blijf dan de veiligheidscontroles niet werken.

Ik denk dat het probleem is dat de preauthorize annotatie niet wordt herkend bij het starten van STS. Ik kan het reproduceren met een eenvoudige gradle veer boot applicatie die gebruik maakt van dezelfde overervingshiërarchie als mijn echte applicatie.

  • DemoEntity uitgaand BaseDemo die zich AbstractBaseEntity.
  • DemoService uitgaand AbstractService die uitvoering IEntityService
  • DemoService gereedschappen IDemoService die zich IEntityService.

Hier is de code in kwestie:

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

Opmerking:

  • Ik geannoteerde het creëren methode van de klasse DemoService.
  • Deze methode heeft voorrang op de methode creëren van AbstractService en voert het de methode die wordt verklaard op IEntityService.

Ik druk de methoden en hun aantekeningen met de volgende code.

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

Bij het starten met de gradle taak bootRun, krijg ik het volgende resultaat:

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

De annotatie is er voor elke methode in de erfenis hiërarchie. Bij het starten van de toepassing van STS, is het resultaat:

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

Ik denk dat deze demo reproduceert de reden voor mijn probleem in de echte applicatie. Ik heb het project met de lente initializr met Spring Boot 2.2.0, Java 11 en die geen andere afhankelijkheid.

Kan iemand mij vertellen, waarom STS levert andere resultaten dan het draaien van bootRun? Moet ik een parameter of instelling toe te voegen in mijn STS, zodat het zich gedraagt ​​op dezelfde manier als bootRun?

De vraag is gesteld op 24/10/2019 om 12:55
bron van user
In andere talen...                            

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