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