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
mitbinder.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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die ValidatorFactory sind, Sie verwenden. Oder um es anders auszudrücken, soll heissen Sie bootstrap-Bean-Validierung? Pro Standard-Bean-Validierung (und Hibernate Validator als Referenz-Implementierung) nicht injizieren von Abhängigkeiten in ConstraintValidator Instanzen. Zumindest in Bean Validation 1.0.
Aktivieren dependency injection konfigurieren Sie eine benutzerdefinierte ConstraintValidatorFactory. Spring bietet SpringConstraintValidatorFactory das ist die Standardeinstellung bei der Verwendung LocalValidatorFactoryBean - siehe http://static.springsource.org/spring/docs/3.0.0.RC3/reference/html/ch05s07.html
Außerdem sind Sie mit JPA? Ich nehme also, in dem Fall die automatische Validierung auf dem Lebenszyklus-Ereignisse automatisch. Anstatt zu versuchen, um Ereignis-Listener entfernen, können Sie einfach die Eigenschaft javax.die Persistenz.die Validierung.Modus und setzen Sie ihn auf KEINE. Ich Frage mich, ob das Recht validator wird verwendet auf life-cycle-basierte Validierung.
Es würde alles davon abhängen, Ihre gesamte Frühjahr-Konfiguration und-Einsatz.
Geben Sie die validator-factory verwendet werden, die von der PPV bei der Durchführung der Validierung:
Erforderlich, da sonst die Standard-factory (wie angegeben in validation.xml) wäre von JPA.
Haben Sie eine @Component-annotation auf der DonorTypeExistsConstraintValidator?
Dass hat mich getötet in der Vergangenheit.
Kein Glück mit LocalValidatorFactoryBean. Ich habe getan, einige hack um dieses problem zu lösen.