Changes to validation code to make javax.validation an optional dependency.

This commit is contained in:
Jon Brisbin
2013-03-06 10:20:44 -06:00
parent db5f7de747
commit 0b34c81394
5 changed files with 63 additions and 12 deletions

View File

@@ -27,9 +27,9 @@ public class RestExporterExampleRestConfig extends RepositoryRestMvcConfiguratio
return msgsrc;
}
@Bean public PersonValidator beforeCreatePersonValidator() {
return new PersonValidator();
}
// @Bean public PersonValidator beforeCreatePersonValidator() {
// return new PersonValidator();
// }
@Override protected void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
config.addResourceMappingForDomainType(Person.class)

View File

@@ -29,6 +29,7 @@ public class Person {
@Description("A person's first name")
private String firstName;
@Description("A person's last name")
@NotNull
private String lastName;
@Description("A person's siblings")
private List<Person> siblings = Collections.emptyList();
@@ -65,7 +66,6 @@ public class Person {
return lastName;
}
@NotNull
public void setLastName(String lastName) {
this.lastName = lastName;
}

View File

@@ -9,7 +9,6 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import javax.validation.ConstraintViolationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -31,9 +30,9 @@ import org.springframework.data.rest.repository.RepositoryConstraintViolationExc
import org.springframework.data.rest.repository.invoke.MethodParameterConversionService;
import org.springframework.data.rest.repository.support.ResourceMappingUtils;
import org.springframework.data.rest.webmvc.support.BaseUriLinkBuilder;
import org.springframework.data.rest.webmvc.support.ConstraintViolationExceptionMessage;
import org.springframework.data.rest.webmvc.support.ExceptionMessage;
import org.springframework.data.rest.webmvc.support.RepositoryConstraintViolationExceptionMessage;
import org.springframework.data.rest.webmvc.support.ValidationExceptionHandler;
import org.springframework.hateoas.EntityLinks;
import org.springframework.hateoas.Link;
import org.springframework.hateoas.LinkBuilder;
@@ -137,14 +136,21 @@ public class AbstractRepositoryRestController implements ApplicationContextAware
}
@ExceptionHandler({
ConstraintViolationException.class
RuntimeException.class
})
@ResponseBody
public ResponseEntity handleConstraintViolationException(Locale locale,
ConstraintViolationException cve) {
return response(null,
new ConstraintViolationExceptionMessage(cve, applicationContext, locale),
HttpStatus.BAD_REQUEST);
public ResponseEntity maybeHandleValidationException(Locale locale,
RuntimeException ex) {
ValidationExceptionHandler handler = applicationContext.getBean(ValidationExceptionHandler.class);
if(null != handler) {
return handler.handleValidationException(ex,
applicationContext,
locale);
} else {
return response(null,
ex,
HttpStatus.BAD_REQUEST);
}
}
@ExceptionHandler({

View File

@@ -10,6 +10,7 @@ import com.fasterxml.jackson.databind.SerializationFeature;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
import org.springframework.context.annotation.Lazy;
import org.springframework.core.convert.support.ConfigurableConversionService;
import org.springframework.data.repository.support.DomainClassConverter;
import org.springframework.data.rest.config.RepositoryRestConfiguration;
@@ -37,12 +38,14 @@ import org.springframework.data.rest.webmvc.RepositorySearchController;
import org.springframework.data.rest.webmvc.ServerHttpRequestMethodArgumentResolver;
import org.springframework.data.rest.webmvc.convert.UriListHttpMessageConverter;
import org.springframework.data.rest.webmvc.support.RepositoryEntityLinks;
import org.springframework.data.rest.webmvc.support.ValidationExceptionHandler;
import org.springframework.format.support.DefaultFormattingConversionService;
import org.springframework.hateoas.EntityLinks;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor;
import org.springframework.util.ClassUtils;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
@@ -61,6 +64,11 @@ import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandl
@ImportResource("classpath*:META-INF/spring-data-rest/**/*.xml")
public class RepositoryRestMvcConfiguration {
private static final boolean IS_JAVAX_VALIDATION_AVAILABLE = ClassUtils.isPresent(
"javax.validation.ConstraintViolationException",
RepositoryRestMvcConfiguration.class.getClassLoader()
);
@Bean public RepositoriesFactoryBean repositories() {
return new RepositoriesFactoryBean();
}
@@ -91,6 +99,14 @@ public class RepositoryRestMvcConfiguration {
return listener;
}
@Bean @Lazy public ValidationExceptionHandler validationExceptionHandler() {
if(IS_JAVAX_VALIDATION_AVAILABLE) {
return new ValidationExceptionHandler();
} else {
return null;
}
}
/**
* Main configuration for the REST exporter.
*/

View File

@@ -0,0 +1,29 @@
package org.springframework.data.rest.webmvc.support;
import java.util.Locale;
import javax.validation.ConstraintViolationException;
import org.springframework.context.MessageSource;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.Assert;
/**
* @author Jon Brisbin
*/
public class ValidationExceptionHandler {
public ResponseEntity<?> handleValidationException(RuntimeException ex,
MessageSource msgsrc,
Locale locale) {
Assert.isAssignable(ConstraintViolationException.class, ex.getClass());
return new ResponseEntity<ConstraintViolationExceptionMessage>(
new ConstraintViolationExceptionMessage((ConstraintViolationException)ex,
msgsrc,
locale),
HttpStatus.BAD_REQUEST
);
}
}