example data custom spring-data-jpa spring-boot spring-data-rest

spring-data-jpa - custom - spring data rest maven



¿Se puede usar la validación JSR 303 Bean con Spring Data Rest? (3)

Comprendo desde los documentos http://docs.spring.io/spring-data/rest/docs/2.1.2.RELEASE/reference/html/validation-chapter.html que puedo declarar validadores con ciertos prefijos.

Estoy usando JSR 303 por lo que mis entidades de dominio están anotadas con anotaciones de validación.

¿Puedo, y si es así, cómo, uso JSR 303 Bean Validation con Spring Data Rest?

PD: estoy usando Spring Boot


// Edición - Dar más información basada en el comentario de esta respuesta y cambiar el código en consecuencia.

Documentación relacionada - http://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

Notas

//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 {

Este es un manejador de excepciones para Spring que debería funcionar bien en el arranque de primavera.

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; } } }


Esto parece funcionar:

@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); } }


Para personalizar la configuración del RepositoryRestConfigurer datos de primavera, registre RepositoryRestConfigurer (o extienda RepositoryRestConfigurerAdapter ) e implemente o anule el método configureValidatingRepositoryEventListener para su caso de uso específico.

public class CustomRepositoryRestConfigurer extends RepositoryRestConfigurerAdapter { @Autowired private Validator validator; @Override public void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener validatingListener) { validatingListener.addValidator("beforeCreate", validator); validatingListener.addValidator("beforeSave", validator); } }