Fixed bugs in standalone configuration to make it easier to integrate with existing MVC applications.

This commit is contained in:
Jon Brisbin
2012-06-25 11:29:03 -05:00
parent 25b8813604
commit 7696c96580
4 changed files with 61 additions and 61 deletions

View File

@@ -1,5 +1,6 @@
package org.springframework.data.rest.repository;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@@ -54,6 +55,18 @@ public abstract class RepositoryExporterSupport<S extends RepositoryExporterSupp
return (S) this;
}
/**
* Set the {@link RepositoryExporter}s to use.
*
* @param repositoryExporter
* @return
*/
@SuppressWarnings({"unchecked"})
public S repositoryExporters(RepositoryExporter... repositoryExporter) {
setRepositoryExporters(Arrays.asList(repositoryExporter));
return (S) this;
}
/**
* Find {@link RepositoryMetadata} for the {@link org.springframework.data.repository.Repository} exported under this
* name.

View File

@@ -3,6 +3,7 @@ package org.springframework.data.rest.webmvc;
import java.util.List;
import javax.persistence.EntityManagerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.Ordered;
import org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
@@ -12,10 +13,10 @@ import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandl
*/
public class RepositoryExporterHandlerMapping extends RequestMappingHandlerMapping {
@Autowired
private EntityManagerFactory entityManagerFactory;
public RepositoryExporterHandlerMapping(EntityManagerFactory entityManagerFactory) {
this.entityManagerFactory = entityManagerFactory;
public RepositoryExporterHandlerMapping() {
setOrder(Ordered.HIGHEST_PRECEDENCE);
}
@@ -24,9 +25,11 @@ public class RepositoryExporterHandlerMapping extends RequestMappingHandlerMappi
}
@Override protected void extendInterceptors(List<Object> interceptors) {
OpenEntityManagerInViewInterceptor omivi = new OpenEntityManagerInViewInterceptor();
omivi.setEntityManagerFactory(entityManagerFactory);
interceptors.add(omivi);
if (null != entityManagerFactory) {
OpenEntityManagerInViewInterceptor omivi = new OpenEntityManagerInViewInterceptor();
omivi.setEntityManagerFactory(entityManagerFactory);
interceptors.add(omivi);
}
}
}

View File

@@ -25,6 +25,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactoryUtils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.convert.ConversionService;
@@ -62,8 +63,12 @@ import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.ByteArrayHttpMessageConverter;
import org.springframework.http.converter.FormHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.ui.ExtendedModelMap;
import org.springframework.ui.Model;
@@ -100,14 +105,23 @@ public class RepositoryRestController
private ApplicationContext applicationContext;
private MediaType uriListMediaType = MediaType.parseMediaType("text/uri-list");
private MediaType jsonMediaType = MediaType.parseMediaType("application/x-spring-data+json");
private MediaType jsonMediaType = MediaType.parseMediaType("application/json");
@Autowired(required = false)
private DelegatingConversionService conversionService = new DelegatingConversionService(
new DefaultFormattingConversionService()
);
private List<HttpMessageConverter<?>> httpMessageConverters = Collections.emptyList();
@Autowired(required = false)
private List<HttpMessageConverter> httpMessageConverters = new ArrayList<HttpMessageConverter>();
private Map<String, Handler<Object, Object>> resourceHandlers = Collections.emptyMap();
private ObjectMapper objectMapper = new ObjectMapper();
{
httpMessageConverters.add(0, new StringHttpMessageConverter());
httpMessageConverters.add(0, new ByteArrayHttpMessageConverter());
httpMessageConverters.add(0, new FormHttpMessageConverter());
httpMessageConverters.add(0, new MappingJacksonHttpMessageConverter());
}
@Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@@ -131,20 +145,20 @@ public class RepositoryRestController
return this;
}
public List<HttpMessageConverter<?>> getHttpMessageConverters() {
public List<HttpMessageConverter> getHttpMessageConverters() {
return httpMessageConverters;
}
public void setHttpMessageConverters(List<HttpMessageConverter<?>> httpMessageConverters) {
public void setHttpMessageConverters(List<HttpMessageConverter> httpMessageConverters) {
Assert.notNull(httpMessageConverters);
this.httpMessageConverters = httpMessageConverters;
}
public List<HttpMessageConverter<?>> httpMessageConverters() {
public List<HttpMessageConverter> httpMessageConverters() {
return httpMessageConverters;
}
public RepositoryRestController httpMessageConverters(List<HttpMessageConverter<?>> httpMessageConverters) {
public RepositoryRestController httpMessageConverters(List<HttpMessageConverter> httpMessageConverters) {
setHttpMessageConverters(httpMessageConverters);
return this;
}

View File

@@ -1,21 +1,16 @@
package org.springframework.data.rest.webmvc;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManagerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
import org.springframework.core.Ordered;
import org.springframework.data.rest.repository.RepositoryExporter;
import org.springframework.data.rest.repository.context.ValidatingRepositoryEventListener;
import org.springframework.data.rest.repository.jpa.JpaRepositoryExporter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.view.ContentNegotiatingViewResolver;
@@ -27,38 +22,12 @@ import org.springframework.web.servlet.view.ContentNegotiatingViewResolver;
@ImportResource("classpath*:META-INF/spring-data-rest/**/*-export.xml")
public class RepositoryRestMvcConfiguration {
ContentNegotiatingViewResolver viewResolver;
RepositoryRestController repositoryRestController;
@Autowired
EntityManagerFactory entityManagerFactory;
@Autowired(required = false)
JpaRepositoryExporter customJpaRepositoryExporter;
@Autowired(required = false)
List<HttpMessageConverter<?>> httpMessageConverters = new ArrayList<HttpMessageConverter<?>>();
@Autowired(required = false)
ValidatingRepositoryEventListener validatingRepositoryEventListener;
RepositoryExporterHandlerAdapter repositoryExporterHandlerAdapter;
RepositoryExporterHandlerMapping repositoryExporterHandlerMapping;
@Bean RepositoryExporterHandlerAdapter repositoryExporterHandlerAdapter() {
if (null == repositoryExporterHandlerAdapter) {
repositoryExporterHandlerAdapter = new RepositoryExporterHandlerAdapter();
}
return repositoryExporterHandlerAdapter;
}
@Bean RepositoryExporterHandlerMapping repositoryExporterHandlerMapping() {
if (null == repositoryExporterHandlerMapping) {
repositoryExporterHandlerMapping = new RepositoryExporterHandlerMapping(entityManagerFactory);
}
return repositoryExporterHandlerMapping;
}
@Bean PersistenceAnnotationBeanPostProcessor persistenceAnnotationBeanPostProcessor() {
return new PersistenceAnnotationBeanPostProcessor();
}
@@ -88,31 +57,32 @@ public class RepositoryRestMvcConfiguration {
}
@Bean ContentNegotiatingViewResolver contentNegotiatingViewResolver() {
if (null == viewResolver) {
viewResolver = new ContentNegotiatingViewResolver();
viewResolver.setOrder(Ordered.HIGHEST_PRECEDENCE);
ContentNegotiatingViewResolver viewResolver = new ContentNegotiatingViewResolver();
viewResolver.setOrder(Ordered.HIGHEST_PRECEDENCE);
Map<String, String> mediaTypes = new HashMap<String, String>() {{
put("json", "application/json");
put("urilist", "text/uri-list");
}};
viewResolver.setMediaTypes(mediaTypes);
Map<String, String> mediaTypes = new HashMap<String, String>() {{
put("json", "application/json");
put("urilist", "text/uri-list");
}};
viewResolver.setMediaTypes(mediaTypes);
RepositoryRestViewResolver jsonvr = new RepositoryRestViewResolver(jsonView());
RepositoryRestViewResolver urilistvr = new RepositoryRestViewResolver(urilistView());
viewResolver.setViewResolvers(Arrays.<ViewResolver>asList(jsonvr, urilistvr));
RepositoryRestViewResolver jsonvr = new RepositoryRestViewResolver(jsonView());
RepositoryRestViewResolver urilistvr = new RepositoryRestViewResolver(urilistView());
viewResolver.setViewResolvers(Arrays.<ViewResolver>asList(jsonvr, urilistvr));
}
return viewResolver;
}
@Bean RepositoryRestController repositoryRestController() throws Exception {
if (null == repositoryRestController) {
this.repositoryRestController = new RepositoryRestController()
.repositoryExporters(Arrays.<RepositoryExporter>asList(jpaRepositoryExporter()))
.httpMessageConverters(repositoryExporterHandlerAdapter().getMessageConverters())
.jsonMediaType("application/json");
}
return repositoryRestController;
return new RepositoryRestController();
}
@Bean RepositoryExporterHandlerAdapter repositoryExporterHandlerAdapter() {
return new RepositoryExporterHandlerAdapter();
}
@Bean RepositoryExporterHandlerMapping repositoryExporterHandlerMapping() {
return new RepositoryExporterHandlerMapping();
}
}