I try to run the project (using SpringWebMVC) with the error:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type ‘javax.validation.Validator‘ available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
My project is “stuck” with no bean to inject into the beanValidator instance – the place I highlighted below – and I don’t know how to fix it. I thought this bean – javax.validation.Validator – is provided by Spring, no need to specify manually similar to
@Autowired
private org.springframework.core.env.Environment env;
Here is my code:
<code>import com.busplanner.pojo.Users;
import java.util.HashSet;
import javax.validation.ConstraintViolation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
public class WebAppValidator implements Validator {
private javax.validation.Validator beanValidator;**
private Set<Validator> springValidators = new HashSet<>();
public boolean supports(Class<?> clazz) {
return Users.class.isAssignableFrom(clazz);
public void validate(Object target, Errors errors) {
Set<ConstraintViolation<Object>> constraintViolations = beanValidator.validate(target);
for (ConstraintViolation<Object> obj : constraintViolations) {
obj.getPropertyPath().toString(),
obj.getMessageTemplate(),
for (Validator obj : springValidators) {
obj.validate(target, errors);
public void setSpringValidators(Set<Validator> springValidators) {
this.springValidators = springValidators;
<code>import com.busplanner.pojo.Users;
import java.util.HashSet;
import java.util.Set;
import javax.validation.ConstraintViolation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
@Component
public class WebAppValidator implements Validator {
**@Autowired
private javax.validation.Validator beanValidator;**
private Set<Validator> springValidators = new HashSet<>();
@Override
public boolean supports(Class<?> clazz) {
return Users.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
Set<ConstraintViolation<Object>> constraintViolations = beanValidator.validate(target);
for (ConstraintViolation<Object> obj : constraintViolations) {
errors.rejectValue(
obj.getPropertyPath().toString(),
obj.getMessageTemplate(),
obj.getMessage());
}
for (Validator obj : springValidators) {
obj.validate(target, errors);
}
}
public void setSpringValidators(Set<Validator> springValidators) {
this.springValidators = springValidators;
}
}
</code>
import com.busplanner.pojo.Users;
import java.util.HashSet;
import java.util.Set;
import javax.validation.ConstraintViolation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
@Component
public class WebAppValidator implements Validator {
**@Autowired
private javax.validation.Validator beanValidator;**
private Set<Validator> springValidators = new HashSet<>();
@Override
public boolean supports(Class<?> clazz) {
return Users.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
Set<ConstraintViolation<Object>> constraintViolations = beanValidator.validate(target);
for (ConstraintViolation<Object> obj : constraintViolations) {
errors.rejectValue(
obj.getPropertyPath().toString(),
obj.getMessageTemplate(),
obj.getMessage());
}
for (Validator obj : springValidators) {
obj.validate(target, errors);
}
}
public void setSpringValidators(Set<Validator> springValidators) {
this.springValidators = springValidators;
}
}
And WebApplicationContext
@EnableTransactionManagement
@ComponentScan(basePackages = {
"com.busplanner.controllers",
"com.busplanner.repositories",
"com.busplanner.services",
"com.busplanner.component",
"com.busplanner.validator",
public class WebApplicationContext implements WebMvcConfigurer {
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
public MessageSource messageSource() {
ResourceBundleMessageSource resource = new ResourceBundleMessageSource();
resource.setBasenames("beanValidator", "webapp");
public void addFormatters(FormatterRegistry registry) {
registry.addFormatter(new BusFormatter());
registry.addFormatter(new RouteFormatter());
@Bean(name = "validator")
public LocalValidatorFactoryBean validator() {
LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
bean.setValidationMessageSource(messageSource());
public Validator getValidator() {
public WebAppValidator applicationValidator() {
Set<Validator> springValidators = new HashSet<>();
springValidators.add(new UsernameValidator());
WebAppValidator validator = new WebAppValidator();
validator.setSpringValidators(springValidators);
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
jsonConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));
converters.add(jsonConverter);
<code>@Configuration
@EnableWebMvc
@EnableTransactionManagement
@ComponentScan(basePackages = {
"com.busplanner.controllers",
"com.busplanner.repositories",
"com.busplanner.services",
"com.busplanner.component",
"com.busplanner.validator",
})
public class WebApplicationContext implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource resource = new ResourceBundleMessageSource();
resource.setBasenames("beanValidator", "webapp");
return resource;
}
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatter(new BusFormatter());
registry.addFormatter(new RouteFormatter());
}
@Bean(name = "validator")
public LocalValidatorFactoryBean validator() {
LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
bean.setValidationMessageSource(messageSource());
return bean;
}
@Override
public Validator getValidator() {
return validator();
}
@Bean
public WebAppValidator applicationValidator() {
Set<Validator> springValidators = new HashSet<>();
springValidators.add(new UsernameValidator());
WebAppValidator validator = new WebAppValidator();
validator.setSpringValidators(springValidators);
return validator;
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
jsonConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));
converters.add(jsonConverter);
}
}
</code>
@Configuration
@EnableWebMvc
@EnableTransactionManagement
@ComponentScan(basePackages = {
"com.busplanner.controllers",
"com.busplanner.repositories",
"com.busplanner.services",
"com.busplanner.component",
"com.busplanner.validator",
})
public class WebApplicationContext implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource resource = new ResourceBundleMessageSource();
resource.setBasenames("beanValidator", "webapp");
return resource;
}
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatter(new BusFormatter());
registry.addFormatter(new RouteFormatter());
}
@Bean(name = "validator")
public LocalValidatorFactoryBean validator() {
LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
bean.setValidationMessageSource(messageSource());
return bean;
}
@Override
public Validator getValidator() {
return validator();
}
@Bean
public WebAppValidator applicationValidator() {
Set<Validator> springValidators = new HashSet<>();
springValidators.add(new UsernameValidator());
WebAppValidator validator = new WebAppValidator();
validator.setSpringValidators(springValidators);
return validator;
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
jsonConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));
converters.add(jsonConverter);
}
}
And pom.xml
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.5.Final</version>
<code> <dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.5.Final</version>
</dependency>
</code>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.5.Final</version>
</dependency>