복붙노트

[SPRING] 유효성 검사기에 서비스 자동 연결

SPRING

유효성 검사기에 서비스 자동 연결

이 예제는 다소 고안된 것입니다. 불필요한 세부 사항을 제거하고 내가 가지고있는 문제에 집중하기 위해 그것을 단순화했습니다. 다음과 같은 유효성 검사기가 있습니다.

@Component
public class UniqueUsernameValidator implements ConstraintValidator<UniqueUsername, String> {

    @Autowired
    UsernameService usernameService;

    @Override
    public void initialize(UniqueUsername uniqueUsername) {
    }

    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        return !usernameService.exists(s);
    }   
}

내 컨트롤러에서 validator를 다음과 같이 호출합니다.

@RequestMapping
public void checkUsername(Model model, User user) {
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    Validator validator = factory.getValidator();

    Set<ConstraintViolation<User>> constraintViolations = validator.validateProperty(user, "username");
    model.addAttribute("error", constraintViolations.size() > 0);
}

그러나 NullPointerException 예외가 계속 발생합니다. 나는 유효성 검사기에 중단 점을 추가하고 usernameService가 null임을 확인했습니다. 왜 autowired되지 않는 이유는 무엇입니까? 처음에는 @Component를 사용하여 유효성 검사기에 주석을 달지 않았기 때문에 생각했습니다.하지만 주석을 달고 나서도 동일한 문제가 발생했습니다. UsernameService 클래스는 이미 @Service로 주석을 달았으며 생성자가 호출되는지 확인할 수 있습니다.

나는 봄에 익숙하지 않기 때문에 서비스를 검사기에 연결하는 것이 괜찮은지조차 확신 할 수 없다. 내가 뭘 잘못하고 있죠?

해결법

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

    1.Spring에서는 참조에서 설명한대로 Validation.buildDefaultValidatorFactory () 대신 LocalValidatorFactoryBean을 통해 ValidatorFactory (또는 Validator 자체)를 가져와야합니다.

    Spring에서는 참조에서 설명한대로 Validation.buildDefaultValidatorFactory () 대신 LocalValidatorFactoryBean을 통해 ValidatorFactory (또는 Validator 자체)를 가져와야합니다.

    @Autowired
    Validator validator;
    
    @RequestMapping 
    public void checkUsername(Model model, User user) { 
        Set<ConstraintViolation<User>> constraintViolations = validator.validateProperty(user, "username"); 
        model.addAttribute("error", constraintViolations.size() > 0); 
    } 
    

    -

    <bean id="validator"
        class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
    

    편집 :하지만 아마도 더 좋은 방법은 @Valid 주석을 사용하여 Spring MVC의 자동 유효성 검사를 사용하는 것이다.

    @RequestMapping  
    public void checkUsername(Model model, @Valid User user, BindingResult result) {  
        if (result.hasErrors()) {   
            ...
        }
    }
    

    이것은 또한 설정에서 를 요구한다.

  2. ==============================

    2.새로운 밸리데이터를 만드는 대신 컨트롤러에 자동 와이어 링하거나 주입해야합니다. 귀하의 검사기로 주입되지 않는 서비스의 NPE는 봄에 의해 생성 / 관리되지 않습니다.

    새로운 밸리데이터를 만드는 대신 컨트롤러에 자동 와이어 링하거나 주입해야합니다. 귀하의 검사기로 주입되지 않는 서비스의 NPE는 봄에 의해 생성 / 관리되지 않습니다.

  3. from https://stackoverflow.com/questions/3587317/autowiring-a-service-into-a-validator by cc-by-sa and MIT license