Java σχολιασμού δεν αναγνωρίζονται

ψήφοι
0

Έχω μια εφαρμογή εκκίνησης άνοιξη χρησιμοποιώντας @PreAuthorize για τους ελέγχους ασφαλείας. Η επικύρωση λειτουργεί στην αίτησή μου, αν μπορώ να ξεκινήσω την εκτέλεση του gradle bootRun εργασία. Αν αρχίσω την εφαρμογή από την άνοιξη Tool Suite (με τυπική διαμόρφωση πίστα), οι έλεγχοι ασφαλείας δεν λειτουργούν.

Νομίζω ότι το πρόβλημα είναι ότι ο σχολιασμός προεγκρίνει δεν αναγνωρίζεται κατά την εκκίνηση από το STS. Μπορώ να το αναπαράγει με μια απλή gradle εφαρμογή εκκίνησης άνοιξη χρησιμοποιώντας την ίδια ιεραρχία κληρονομικότητας ως πραγματικό αίτησή μου.

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

Σημείωση:

  • Έχω σχολιασμένη τη μέθοδο «δημιουργούν» για την κατηγορία DemoService.
  • Η μέθοδος αυτή παρακάμπτει τη μέθοδο «δημιουργία» της 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();
            }
        }
    }
}

Όταν ξεκινάτε με την gradle 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

Νομίζω ότι αυτό το demo αναπαράγει το λόγο για το πρόβλημά μου στην πραγματική εφαρμογή. Δημιούργησα το έργο με την άνοιξη initializr χρησιμοποιώντας την άνοιξη εκκίνησης 2.2.0, Java 11 και μη έχοντας άλλη εξάρτηση.

Μπορεί κανείς να μου πει, γιατί STS παράγει άλλα αποτελέσματα από την εκτέλεση bootRun; Χρειάζεται να προσθέσετε μια παράμετρο ή ρύθμιση στο STS μου, έτσι ώστε να συμπεριφέρεται με τον ίδιο τρόπο όπως bootRun;

Δημοσιεύθηκε 24/10/2019 στις 12:55
πηγή χρήστη
Σε άλλες γλώσσες...                            

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