Autowired-Repository ist Null in Benutzerdefinierten Constraint-Validator

Ich habe eine Spring-basierte Web-App. Ich bin über mehrere repository-Klassen mit Annotationen @Repository, @Transactional, die in meinem Controller. Das Teil funktioniert einwandfrei.

Ich erstellt ein Benutzerdefiniertes Constraint-Validator, die Zugriff auf das repository. Jetzt bin ich nicht in der Lage zu verstehen, warum das Repository ist null. Ich habe versucht, hinzufügen von Anmerkungen der Prüfer mit @Component-annotation. Mein base-Paket enthält alle Klassen ist in dem Teil der xml. Also, was sollte ich sonst tun, um sicherzustellen, das repository dependency injection funktioniert. Dies ist, wie mein Constraint-validator aussieht.

public class DonorTypeExistsConstraintValidator implements
    ConstraintValidator<DonorTypeExists, DonorType> {

  @Autowired
  private DonorTypeRepository donorTypeRepository;

  @Override
  public void initialize(DonorTypeExists constraint) {

  }

  public boolean isValid(DonorType target, ConstraintValidatorContext context) {

   System.out.println("donorType: " + target);
   if (target == null)
     return true;

   try {
    if (donorTypeRepository.isDonorTypeValid(target.getDonorType()))
     return true;
   } catch (Exception e) {
    e.printStackTrace();
   }
   return false;
  }

  public void setDonorRepository(DonorTypeRepository donorTypeRepository) {
    this.donorTypeRepository = donorTypeRepository;
  }
}

Update

Paket-scan-Konfiguration:

<context:annotation-config />

<!-- Configures the @Controller programming model -->
<mvc:annotation-driven />

<context:component-scan base-package="controller" />
<context:component-scan base-package="repository" />
<context:component-scan base-package="model" />
<context:component-scan base-package="viewmodel" />

Diese Klasse in das package-Modell.donortype.
Das repository wird in das Paket-repository.

Update

Etwas mehr rätselhaft, entfernen alle preinsert Zuhörer (in diesem Fall nur BeanValidationEventListener) behebt das autowiring Problem. Dies kompliziert die Angelegenheit noch mehr.

Bin ich auch nicht einsetzen BeanValidationEventListener, wie beschrieben in der Antwort unten. Dies ist in der Tat im Gegensatz zu dem Vorschlag hier:
JSR-303 dependency injection und Hibernate

  @Override
  public void integrate(Configuration configuration, SessionFactoryImplementor implementor,
                        SessionFactoryServiceRegistry registry) {
      logger.info("Registering event listeners");
      System.out.println("here");
      //you can add duplication strategory for duplicate registrations

      final EventListenerRegistry eventRegistry = registry.getService(EventListenerRegistry.class);
      //prepend to register before or append to register after
      //this example will register a persist event listener

      eventRegistry.prependListeners(EventType.PERSIST, EntitySaveListener.class);
      eventRegistry.appendListeners(EventType.MERGE, EntitySaveListener.class);
      Iterator<PreInsertEventListener> iter = eventRegistry.getEventListenerGroup(EventType.PRE_INSERT).listeners().iterator();
      while (iter.hasNext()) {
        PreInsertEventListener el = iter.next();
        System.out.println(el.getClass());
        BeanValidationEventListener listener = (BeanValidationEventListener) el;
        System.out.println(listener);
        iter.remove();
      }
  }

Update

Bin ich mit dem PPV. Ich habe eine Unterlage, Formular für die JPA-Entitäten. In der Steuerung ich verwenden InitBinder zu instanziieren Sie eine benutzerdefinierte validator -binder.setValidator(new EntityBackingFormValidator(binder.getValidator()));.
Hier ist der code dafür:
https://github.com/C4G/V2V/blob/87dc266043f6d623c101d947a88fa0b0ad536355/src/controller/CollectedSampleController.java

Diese custom-validator aufruft, die Validierung auf der Standard-validator und Spielraum zu tun, einige benutzerdefinierte Validierungen.
https://github.com/C4G/V2V/blob/87dc266043f6d623c101d947a88fa0b0ad536355/src/model/collectedsample/CollectedSampleBackingFormValidator.java

Ich bin mit Anmerkungen innerhalb der Entität zu erstellen-Einschränkungen. Abgesehen von der default-Einschränkungen, die ich brauche, um zu definieren, Einschränkungen, die prüfen, ob eine Entität auf der anderen Seite eine viele-zu-eins-Zuordnung existiert oder nicht.
Hier ist der angepasste constraint-validator.
https://github.com/C4G/V2V/blob/87dc266043f6d623c101d947a88fa0b0ad536355/src/model/donor/DonorExistsConstraintValidator.java

Nun die autowired-repository benutzerdefinierte constraint-validator null ist. Ich bin versucht zu passen-code in meine CustomIntegrator, die hier vorhanden ist
https://github.com/C4G/V2V/blob/87dc266043f6d623c101d947a88fa0b0ad536355/src/interceptor/CustomIntegrator.java

und die xml-Konfiguration-Datei hier vorhanden
https://github.com/C4G/V2V/blob/87dc266043f6d623c101d947a88fa0b0ad536355/war/WEB-INF/v2v-servlet.xml

Hoffentlich der eigentliche code wird Ihnen helfen, um meine Frage zu beantworten.
Danke!

  • In dem Paket ist die Klasse DonorTypeExistsConstraintValidator und auch zeigen Sie Ihre Paket-scan-Konfiguration.
  • haben Sie enthalten <context:annotation-config /> oder AutowiredAnnotationBeanPostProcessor in der Konfiguration?
  • stackoverflow.com/questions/2712345/... ?
  • Ich bin nicht in der Lage zu verstehen, die Antwort auf diese Frage. IIRC habe ich es korrekt funktioniert Letzte Woche, ohne zu tun. Butnow es nicht funktioniert.
  • Durch den Rückgriff auf die alten Begehen, ist einfach zu viel Arbeit. Eine Menge Dinge haben sich seitdem verändert in meinem Modell und Benutzeroberfläche. So sah der code für die offensichtlichen Dinge.
  • Mehr Informationen ... ich bin mit @InitBinder mit binder.setValidator(new MyBackingFormValidator(binder.getValidator()));. Könnte das der Grund sein, warum die dependency injection nicht funktioniert.
  • Ich schaute auf das github-Projekt verwiesen wird, im detail. Es sieht vielversprechend aus. Aber es gibt ein problem - der Ansatz funktioniert nicht mit Hibernate 4. Ereignis-Listener-Eigenschaft kann nicht festgelegt werden, in der neuen version. Ich versuche eine Integratoren basierten Ansatz. stackoverflow.com/a/11672377/161628. Aber es berichtet von einem Doppelten Ereignis-Listener registriert Fehler. Versuchen addDuplicationStrategy aber das auslösen einer anderen Ausnahme.
  • Sorry, ich habe nicht verwendet Hibernate 4 noch gar nicht wirklich irgendwelche Ideen für Sie. Ich bin nur zufällig zu erinnern, gesehen zu haben, dass die Frage in der Vergangenheit und dachte, es könnte deine Antwort sein.

InformationsquelleAutor Rohit Banga | 2012-11-28
Schreibe einen Kommentar