Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.jtalks.jcommune.model.validation.validators.UniqueValidator]: No default constructor found; nested exception is java.lang.NoSuchMethodException: org.jtalks.jcommune.model.validation.validators.UniqueValidator.<init>() at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:83) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1006) ... 126 more Caused by: java.lang.NoSuchMethodException: org.jtalks.jcommune.model.validation.validators.UniqueValidator.<init>() at java.lang.Class.getConstructor0(Class.java:2730) at java.lang.Class.getDeclaredConstructor(Class.java:2004) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:78) ... 127 more
При использовании конструктора по умолчанию и сеттера, ValidatorDao равен null (не инициализируется). Такое ощущение, что для разрешения зависимостей в валидаторах spring может использовать только autowiring.
public class UniqueValidator implements ConstraintValidator<Unique, String> {
private Class<? extends Entity> entity;
private String field;
private boolean ignoreCase;
private ValidatorDao<String> dao;
/**
* @param dao to perform database-based validations
*/
//@Autowired
public UniqueValidator(ValidatorDao<String> dao) {
this.dao = dao;
}
/**
* {@inheritDoc}
*/
@Override
public void initialize(Unique annotation) {
this.entity = annotation.entity();
this.field = annotation.field();
this.ignoreCase = annotation.ignoreCase();
}
/**
* {@inheritDoc}
*/
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
// null value should be processed by other constraint validators
return value == null || dao.isResultSetEmpty(entity, field, value, ignoreCase);
}
}public class TransactionalAuthenticator extends AbstractTransactionalEntityService<JCUser, UserDao>
implements Authenticator {
private PluginLoader pluginLoader;
private EncryptionService encryptionService;
private AuthenticationManager authenticationManager;
private SecurityContextHolderFacade securityFacade;
private RememberMeServices rememberMeServices;
private SessionAuthenticationStrategy sessionStrategy;
//@Autowired
private Validator validator;
private static final Logger LOGGER = LoggerFactory.getLogger(TransactionalAuthenticator.class);
public TransactionalAuthenticator(PluginLoader pluginLoader, UserDao dao,
EncryptionService encryptionService,
AuthenticationManager authenticationManager,
SecurityContextHolderFacade securityFacade,
RememberMeServices rememberMeServices,
SessionAuthenticationStrategy sessionStrategy,
Validator validator) {
super(dao);
this.pluginLoader = pluginLoader;
this.encryptionService = encryptionService;
this.authenticationManager = authenticationManager;
this.securityFacade = securityFacade;
this.rememberMeServices = rememberMeServices;
this.sessionStrategy = sessionStrategy;
this.validator = validator;
}
public BindingResult register(RegisterUserDto registerUserDto)
throws UnexpectedErrorException, NoConnectionException {
BindingResult result = new BeanPropertyBindingResult(registerUserDto, "newUser");
BindingResult jcErrors = new BeanPropertyBindingResult(registerUserDto, "newUser");
validator.validate(registerUserDto, jcErrors);
registerByPlugin(registerUserDto.getUserDto(), true, result);
mergeValidationErrors(jcErrors, result);
if(!result.hasErrors()) {
registerByPlugin(registerUserDto.getUserDto(), false, result);
}
return result;
}
}applicationContext-dao.xml
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor">
<property name="validator" ref="validator"/>
</bean>
<bean class="org.springframework.validation.beanvalidation.BeanValidationPostProcessor">
<property name="validator" ref="validator"/>
</bean>
<bean id="validatorDAO"
class="org.jtalks.jcommune.model.dao.hibernate.ValidatorHibernateDao">
<constructor-arg ref="sessionFactory"/>
</bean>
<bean id="uniqueValidator" class="org.jtalks.jcommune.model.validation.validators.UniqueValidator">
<constructor-arg ref="validatorDAO"/>
</bean>Подскажите, пожалуйста, если кто сталкивался с похожим, то как решили?

Англійська
Російська