Adnotarea Java nu a recunoscut

voturi
0

Am o aplicație de primăvară de boot folosind @PreAuthorize pentru controalele de securitate. Validarea funcționează în cererea mea, dacă am începe prin executarea bootRun sarcina gradle. Dacă pornesc aplicația din primăvară Tool Suite (folosind configurația run standard), controalele de securitate nu funcționează.

Cred că problema este că adnotarea preautoriza nu este recunoscut la pornirea de la STS. Pot să-l reproduc cu o aplicație de primăvară de boot gradle simplu, folosind aceeași ierarhie ca moștenire cererea mea reală.

  • DemoEntity extinde BaseDemo care se extinde AbstractBaseEntity.
  • „DemoService“ extinde „AbstractService“ care pune în aplicare „IEntityService“
  • DemoService pune în aplicare IDemoService care se extinde IEntityService.

Aici este codul relevant:

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

Notă:

  • Am adnotat metoda „a crea“ de pe DemoService de clasă.
  • Această metodă suprascrie „a crea“ metoda de AbstractService și pune în aplicare metoda care este declarată pe IEntityService.

Imprim metodele și adnotări acestora cu următorul cod.

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

La pornirea cu bootRun sarcina gradle, am obține următorul rezultat:

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

Adnotarea este acolo pentru fiecare metodă în ierarhia de moștenire. La pornirea aplicației de la STS, rezultatul este:

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

Cred că această demonstrație reproduce motivul pentru problema mea în aplicația reală. Am creat proiectul cu arc initializr folosind Spring Boot 2.2.0, Java 11 și având în nici o altă dependență.

Poate cineva spune-mi, de ce STS produce alte rezultate decât să fie difuzate bootRun? Am nevoie pentru a adăuga un parametru sau o setare în STS mea, astfel încât acesta se comportă în același mod ca și bootRun?

Întrebat 24/10/2019 la 12:55
sursa de către utilizator
În alte limbi...                            

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