sourcetip

JSR 303 Bean Validation을 Spring Data Rest와 함께 사용할 수 있습니까?

fileupload 2023. 7. 27. 22:13
반응형

JSR 303 Bean Validation을 Spring Data Rest와 함께 사용할 수 있습니까?

는 docs http://docs.spring.io/spring-data/rest/docs/2.1.2.RELEASE/reference/html/validation-chapter.html 에서 특정 접두사를 사용하여 검증자를 선언할 수 있다는 것을 알고 있습니다.

JSR 303을 사용하여 도메인 엔티티에 유효성 검사 주석을 달았습니다.

JSR 303 Bean Validation with Spring Data Rest를 사용할 수 있습니까?

PS: 저는 스프링 부츠를 사용하고 있습니다.

이것은 효과가 있는 것 같습니다.

@Configuration
protected static class CustomRepositoryRestMvcConfiguration extends RepositoryRestMvcConfiguration {

    @Autowired
    private Validator validator;

    @Override
    protected void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener validatingListener) {
        validatingListener.addValidator("beforeCreate", validator);
        validatingListener.addValidator("beforeSave", validator);
    }
}

스프링 데이터-레스트 구성을 사용자 지정하려면 다음과 같이 등록합니다.RepositoryRestConfigurer(또는 확장)RepositoryRestConfigurerAdapter) 및 구현 또는 오버라이드configureValidatingRepositoryEventListener사용자의 특정 사용 사례에 대한 방법입니다.

public class CustomRepositoryRestConfigurer extends RepositoryRestConfigurerAdapter {

    @Autowired
    private Validator validator;

    @Override
    public void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener validatingListener) {
        validatingListener.addValidator("beforeCreate", validator);
        validatingListener.addValidator("beforeSave", validator);
    }
}

//편집 - 답변에 대한 설명을 기반으로 추가 정보를 제공하고 그에 따라 코드를 변경합니다.

관련 문서 - http://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

메모들

//This is making the handler global for the application
//If this were on a @Controller bean it would be local to the controller
@ControllerAdvice

//Specifies to return a 400
@ResponseStatus(value = HttpStatus.BAD_REQUEST)

//Which exception to handle
@ExceptionHandler(ConstraintViolationException.class)

//Specifies to make the return value JSON.
@ResponseBody

//This class if for modeling the error we return.
//(Could use HashMap<String, Object> also if you feel it's cleaner)
class ConstraintViolationModel {

이것은 스프링 부트에서 잘 작동하는 스프링용 예외 핸들러입니다.

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

@ControllerAdvice
public class ExceptionHandlingController {
    @ResponseStatus(value = HttpStatus.BAD_REQUEST)
    @ExceptionHandler(ConstraintViolationException.class)
    public @ResponseBody List<ConstraintViolationModel> handleConstraintViolation(
            HttpServletRequest req, final ConstraintViolationException exception) {
        ArrayList<ConstraintViolationModel> list = new ArrayList<ConstraintViolationModel>();
        for (ConstraintViolation<?> violation : exception
                .getConstraintViolations()) {
            list.add(new ConstraintViolationModel(violation.getPropertyPath()
                    .toString(), violation.getMessage(), violation
                    .getInvalidValue()));
        }
        return list;
    }

    private static class ConstraintViolationModel {
        public String field;
        public String message;
        public Object invalidValue;

        public ConstraintViolationModel(String field, String message,
                Object invalidValue) {
            this.field = field;
            this.message = message;
            this.invalidValue = invalidValue;
        }
    }
}

이(validatingListener.addValidator("beforeCreate", validator);유효성 검사는 엔티티만 관리하기 때문에 실제로 완전히 작동하지 않습니다.

따라서 예를 들어 비실체에 유효성 검사를 적용하려고 하면 다음과 같은 심각한 오류가 발생합니다.org.springframework.beans.NotReadablePropertyException: Invalid property '...' of bean class [... the non-entity one ...]: Bean property '....' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?

분명히 더 많은 노력이 들지만, 다음과 같이 Validator에서 직접 검증을 수행할 수 있습니다.

@Component("beforeSaveListingValidator")
public class BeforeSaveListingValidator implements Validator {

    @Autowired
    private LocalValidatorFactoryBean validator;

    @Override
    public void validate(Object object, Errors errors) {
        BindingResult bindingResult = new BeanPropertyBindingResult(object, errors.getObjectName());
        validator.validate(object, bindingResult);
        errors.addAllErrors(bindingResult);

언급URL : https://stackoverflow.com/questions/25220440/can-jsr-303-bean-validation-be-used-with-spring-data-rest

반응형