[ 
https://issues.apache.org/jira/browse/WICKET-6382?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16041609#comment-16041609
 ] 

Sven Meier commented on WICKET-6382:
------------------------------------

The difference comes from how/whom your validator is created:

- in case of Spring's rest service:

{code}
          at 
com.showcase.validation.UniqueFieldValidator.<init>(UniqueFieldValidator.java:45)
          ... snip ...
          at 
org.springframework.validation.beanvalidation.SpringConstraintValidatorFactory.getInstance(SpringConstraintValidatorFactory.java:56)
          ... snip ...
          at 
org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:110)
{code}

- in case of Wicket's validation:

{code}
          at 
com.showcase.validation.UniqueFieldValidator.<init>(UniqueFieldValidator.java:45)
          ... snip ...
          at 
org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorFactoryImpl.getInstance(ConstraintValidatorFactoryImpl.java:28)
          ... snip ...
          at 
org.apache.wicket.bean.validation.PropertyValidator.validate(PropertyValidator.java:289)
{code}

So as you can see Spring's SpringConstraintValidatorFactory offers injection, 
while Hibernate's default ConstraintValidatorFactoryImpl doesn't know anything 
about Spring.

IMHO wicket-bootstrap's BeanValidationConfig is to blame, it should use a 
SpringConstraintValidatorFactory too.

> @Autowired in Validator doesn't work with PropertyValidator
> -----------------------------------------------------------
>
>                 Key: WICKET-6382
>                 URL: https://issues.apache.org/jira/browse/WICKET-6382
>             Project: Wicket
>          Issue Type: Bug
>          Components: wicket-bean-validation, wicket-spring
>    Affects Versions: 8.0.0-M6
>            Reporter: Kamil
>         Attachments: wicket-showcase-validatorAutowire.zip
>
>
> I have a generic validator:
> {code}
> @Component
> public class UniqueFieldValidator implements 
> ConstraintValidator<UniqueFieldValidator.UniqueField, String> {
>     private AbstractEntityRepository<?,?> repository;
>     private String fieldName;
>     @Autowired
>     private ApplicationContext applicationContext;
>     @Target({ElementType.METHOD, ElementType.FIELD})
>     @Retention(RetentionPolicy.RUNTIME)
>     @Constraint(validatedBy = UniqueFieldValidator.class)
>     @Documented
>     public @interface UniqueField {
>         String fieldName();
>         Class<? extends AbstractEntityRepository<?,?>> repository();
>         String message() default "field.not.unique";
>         Class<?>[] groups() default {};
>         Class<? extends Payload>[] payload() default {};
>     }
>     @Override
>     public void initialize(UniqueField uniqueField) {
>         this.repository = 
> applicationContext.getBean(uniqueField.repository());
>         fieldName = uniqueField.fieldName();
>     }
>     @Override
>     public boolean isValid(String value, ConstraintValidatorContext ctx) {
>         if(isBlank(value)){
>             return true;
>         }
>         Optional<?> o = repository.getOneByUniqueField(fieldName, value);
>         return isFalse(o.isPresent());
>     }
> }
> {code}
> It works perfectly fine with SpringMVC Controllers, but when using Wicket's
> {code}new PropertyValidator<>(){code} field "repository" is null
> Can you please take care that fields in Validators gets injected as well?



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to