복붙노트

[SPRING] Spring 3.1 사용자 정의 제약 조건 유효성 검사기에서 자동 와이어 링이 작동하지 않습니다.

SPRING

Spring 3.1 사용자 정의 제약 조건 유효성 검사기에서 자동 와이어 링이 작동하지 않습니다.

사용자 정의 제약 조건 유효성 검사기 내부에서 빈 autowiring에 문제가 있습니다. 제약 조건 검사기 인스턴스는 Spring의 LocalValidatorFactoryBean을 사용하여 제공되지 않습니다.  JSR-303 공급자는 최대 절전 유효성 검사기 4.2.0. 최종입니다.

봄 구성 발췌 :

<!-- JSR 303 validation -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/> 

맞춤 제약 검사기 :

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

import org.springframework.beans.factory.annotation.Autowired;

import com.model.Subject;
import com.services.SomeTypeService;

public class ReadOnlyValidator implements ConstraintValidator<ReadOnly, String> {

@Autowired
private SomeTypeService someTypeService;

@Override
public void initialize(ReadOnly constraintAnnotation) { }

@Override
public boolean isValid(String type, ConstraintValidatorContext context) {
    try {
         if (null != type) {
                        return !someTypeService.isReadonly(type);
                     }
    } catch (Exception e) {
        e.printStackTrace();
    }

    return false;
}
}

주석:

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

@Target( { METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER } )
@Retention(RUNTIME)
@Constraint(validatedBy = ReadOnlyValidator.class)
@Documented
public @interface ReadOnly {
String message() default "{constraints.subjecttype.readonly}";
public abstract Class<?>[] groups() default {};
public abstract Class<? extends Payload>[] payload() default {};
}

SomeService :

 @Validated
 public interface SomeService {
    ...
    public void updateType(@ReadOnly String type) throws SomeException;
    ...
 }

SomeServiceImpl :

 @Service
 public class SomeServiceImpl implements SomeService {
  ...
    public void updateType(String type) throws SomeException {
     // do something
    }
  ...
 }

SomeTypeService는 SomeService에 의존하지 않는 또 다른 @Service 주석 처리 된 Bean입니다.

문제는 autowiring이 작동하지 않기 때문에 NPE를 얻는다는 것입니다. 다른 누군가가 Spring이 아닌 사용자 정의 유효성 검사기 인스턴스를 관리하고 있습니다.

모든 유형의 조언에 미리 감사드립니다.

해결법

  1. ==============================

    1.문제를 찾았습니다. 동일한 "validator"빈 참조는 MethodValidationPostProcessor와 mvc : annotation-driven 선언에 사용되어야합니다.

    문제를 찾았습니다. 동일한 "validator"빈 참조는 MethodValidationPostProcessor와 mvc : annotation-driven 선언에 사용되어야합니다.

    service-context.xml

    <!-- JSR 303 validation -->
    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
    <bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor">
        <property name="validator" ref="validator"/>
    </bean>
        ...
    

    dispatcher-servlet.xml

    ...
    <mvc:annotation-driven validator="validator" />
    ...
    
  2. ==============================

    2.Tito, 자바 설정에 다음과 같은 것을 사용할 수 있는지 확인하십시오 :

    Tito, 자바 설정에 다음과 같은 것을 사용할 수 있는지 확인하십시오 :

    @Configuration
    public class SampleConfig {
      ...
    
      @Bean
      public Validator validator() {
        return new LocalValidatorFactoryBean().getValidator();
      }
    
      @Bean
      public MethodValidationPostProcessor mvpp() {
        MethodValidationPostProcessor mvpp = new MethodValidationPostProcessor();
        mvpp.setValidator(validator());
    
        return mvpp;
      }
    
      ...
    }
    

    다른 구성 빈에서 유효성 검사기 빈을 재사용하려면 @Import 주석을 사용할 수 있습니다.

  3. from https://stackoverflow.com/questions/12676299/spring-3-1-autowiring-does-not-work-inside-custom-constraint-validator by cc-by-sa and MIT license