Tak jak w temacie, mam sobie klase implementującą ConstraintValidator<JakasAdnotacja, String>
public class JakasAdnotacjaValidator implements ConstraintValidator<JakasAdnotacja, String> {
@Autowired
private JakisService jakisService;
@Override
public void initialize(JakasAdnotacja jakasAdnotacja) {
}
@Override
public boolean isValid(String costam, ConstraintValidatorContext constraintValidatorContext) {
return jakisService.zrobCosIZwrocTrueFalse();
}
}
I kiedy uruchamiam aplikacje i nastepuje wywołanie adnotacji przy walidacji dostaje coś mniej wiecej takiego (same początki stacktrace podałem, bo wyjatkow jest pare i dość duzo tego)
java.lang.NullPointerException
com.reportme.model.validation.UsernameAvailableValidator.isValid(UsernameAvailableValidator.java:22)
com.reportme.model.validation.UsernameAvailableValidator.isValid(UsernameAvailableValidator.java:10)
org.hibernate.validator.internal.engine.ConstraintTree.validateSingleConstraint(ConstraintTree.java:308)
org.hibernate.validator.internal.engine.ConstraintTree.validateConstraints(ConstraintTree.java:180)
org.hibernate.validator.internal.engine.ConstraintTree.validateConstraints(ConstraintTree.java:124)
javax.validation.ValidationException: HV000028: Unexpected exception during isValid call.
org.hibernate.validator.internal.engine.ConstraintTree.validateSingleConstraint(ConstraintTree.java:311)
org.hibernate.validator.internal.engine.ConstraintTree.validateConstraints(ConstraintTree.java:180)
org.hibernate.validator.internal.engine.ConstraintTree.validateConstraints(ConstraintTree.java:124)
org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:85)
org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:463)
javax.persistence.RollbackException: Error while committing the transaction
org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:94)
org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517)
org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:757)
org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:726)
org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:478)
org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction
org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:526)
org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:757)
org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:726)
org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:478)
Wg tego co szukałem w google musiałem stworzyć bean:
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
Po to zeby można było wstrzykiwać Validator gdzieś, ALE dodatkowo konfiguruje się SpringConstraintValidatorFactory
- więc klasy implementujace ConstraintValidator staja sie beanem - więc moge do nich wstrzykiwać np serwisy. Niestety to nie podziałało.
Próbowałem też dodać adnotacje @Component - też nie podziałało
Kolejne podejście to ApplicationContextAware
, próbowałem to implementować i szukać manualnie beana z kontekstu, ale też rzucało wyjątkiem (nie pamiętam już jakim, w razie czego przekoduje troche i powiem, jesli to bedzie potrzebne - liczę, że robie jakiś głupi błąd)
janusz pomusz..
edit
jeśli by ufać docs'om springa, problem leży gdzieś po stronie transakcji.. choć jak wywołam na jakisService
metode która nie używa bazy, coś w stylu
public void doNothing(){
System.out.println("napis");
}
to dalej mam nullpointerexception na tym service