Tighten up conditions: a web application may not be using Spring MVC

Previously, some classes that were annotatated with
@ConditionalOnWebApplication assumed that, if the application was a
web application, Spring MVC (spring-webmvc) would be on the classpath.
If it was not, the application would fail to start, typically with an
error relating to WebMvcConfigurerAdapter being unavailable.

This commit updates the affected configuration classes and annotates
them with @ConditionalOnClass(WebMvcConfigurerAdapter.class) to
ensure that their auto-configuration only takes effect if its a web
application and Spring MVC is on the classpath.

Fixes gh-2345
pull/2707/head
Andy Wilkinson 10 years ago
parent ac1d0cab3b
commit b875a00ebd

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2013 the original author or authors. * Copyright 2012-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -33,6 +33,7 @@ import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport; import org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport;
import org.springframework.data.web.PageableHandlerMethodArgumentResolver; import org.springframework.data.web.PageableHandlerMethodArgumentResolver;
import org.springframework.data.web.config.EnableSpringDataWebSupport; import org.springframework.data.web.config.EnableSpringDataWebSupport;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/** /**
* {@link EnableAutoConfiguration Auto-configuration} for Spring Data's JPA Repositories. * {@link EnableAutoConfiguration Auto-configuration} for Spring Data's JPA Repositories.
@ -64,6 +65,7 @@ public class JpaRepositoriesAutoConfiguration {
@Configuration @Configuration
@EnableSpringDataWebSupport @EnableSpringDataWebSupport
@ConditionalOnClass(WebMvcConfigurerAdapter.class)
@ConditionalOnWebApplication @ConditionalOnWebApplication
@ConditionalOnMissingBean(PageableHandlerMethodArgumentResolver.class) @ConditionalOnMissingBean(PageableHandlerMethodArgumentResolver.class)
protected static class JpaWebConfiguration { protected static class JpaWebConfiguration {

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2014 the original author or authors. * Copyright 2012-2015 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -28,6 +28,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.boot.autoconfigure.AutoConfigurationPackages; import org.springframework.boot.autoconfigure.AutoConfigurationPackages;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
@ -134,21 +135,28 @@ public abstract class JpaBaseConfiguration implements BeanFactoryAware {
@Configuration @Configuration
@ConditionalOnWebApplication @ConditionalOnWebApplication
@ConditionalOnClass(WebMvcConfigurerAdapter.class)
@ConditionalOnMissingBean({ OpenEntityManagerInViewInterceptor.class, @ConditionalOnMissingBean({ OpenEntityManagerInViewInterceptor.class,
OpenEntityManagerInViewFilter.class }) OpenEntityManagerInViewFilter.class })
@ConditionalOnExpression("${spring.jpa.openInView:${spring.jpa.open_in_view:true}}") @ConditionalOnExpression("${spring.jpa.openInView:${spring.jpa.open_in_view:true}}")
protected static class JpaWebConfiguration extends WebMvcConfigurerAdapter { protected static class JpaWebConfiguration {
@Override // Defined as a nested config to ensure WebMvcConfigurerAdapter is not read when
public void addInterceptors(InterceptorRegistry registry) { // not on the classpath
registry.addWebRequestInterceptor(openEntityManagerInViewInterceptor()); @Configuration
} protected static class JpaWebMvcConfiguration extends WebMvcConfigurerAdapter {
@Bean @Bean
public OpenEntityManagerInViewInterceptor openEntityManagerInViewInterceptor() { public OpenEntityManagerInViewInterceptor openEntityManagerInViewInterceptor() {
return new OpenEntityManagerInViewInterceptor(); return new OpenEntityManagerInViewInterceptor();
} }
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addWebRequestInterceptor(openEntityManagerInViewInterceptor());
}
}
} }
} }

Loading…
Cancel
Save