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
'sourcetip' 카테고리의 다른 글
Ajax 데이터베이스 업데이트 후 전체 일정으로 이벤트 렌더링 (0) | 2023.07.27 |
---|---|
스택 추적에서 로그가 예외를 발견했습니다. (0) | 2023.07.27 |
어떤 것이 null을 나타냅니까?정의되지 않은 문자열 또는 빈 문자열 (0) | 2023.07.27 |
Spring 3.0 MVC @ModelAttribute 변수가 URL에 나타나지 않도록 하려면 어떻게 해야 합니까? (0) | 2023.07.27 |
특정 로컬 알림 삭제 (0) | 2023.07.27 |