I am using ConstraintValidator implementation to validate if character is above certain height defined in application.properties and I have encountered a problem where the field minimumHeight with @Value is always null. I have also tried constructor injection but then it gives out error as follows:
java.lang.NoSuchMethodException: com.miquido.Validator.CharacterValidator.<init>()
at java.base/java.lang.Class.getConstructor0(Class.java:3585) ~[na:na]
at java.base/java.lang.Class.getConstructor(Class.java:2271) ~[na:na]
at org.hibernate.validator.internal.util.privilegedactions.NewInstance.run(NewInstance.java:41) ~[hibernate-validator-6.2.3.Final.jar:6.2.3.Final]
This is my validator:
import org.springframework.beans.factory.annotation.Value;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class CharacterValidator implements ConstraintValidator<ValidCharacter, Long> {
@Autowired
private ConfigProperties configProperties;
@Override
public void initialize(ValidCharacter constraintAnnotation) {
ConstraintValidator.super.initialize(constraintAnnotation);
}
@Override
public boolean isValid(Long value, ConstraintValidatorContext context) {
configProperties = SpringApplicationContextService.getApplicationContext().getBean(ConfigProperties.class);
if (value == null) {
return true;
}
formatMessage(context);
return value >= configProperties.getMinimum();
}
private void formatMessage(ConstraintValidatorContext context) {
String msg = context.getDefaultConstraintMessageTemplate();
String formattedMsg = String.format(msg, configProperties.getMinimum());
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate(formattedMsg)
.addConstraintViolation();
}
}
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = CharacterValidator.class)
public @interface ValidCharacter {
String message() default "Character must be higher than %s";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
EDIT 1 I have edited my code as @antey13 suggested, but still the minimumHeight is null.
EDIT 2 I have added SpringApplicationContextService with static getter that returns ApplicationContext and I inject the bean manually in implementantion of ConstraintValidator.
@Service
public class SpringApplicationContextService implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringApplicationContextService.applicationContext = applicationContext;
}
}