From 3464c0b16e44e362b76d437c63e1c30f2441c03d Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Mon, 21 Nov 2016 13:25:25 +0000 Subject: [PATCH] Ensure that Hypermedia-related auto-config works without Jackson Previously, both HypermediaAutoConfiguration and HttpMessageConverters assumed that if Spring HATEOAS was on the class path, then Jackson would be too. When this was not the case, an application would fail to start. This commit updates both classes to back off appropriately when Spring HATEOAS is on the classpath but Jackson is not. Closes gh-7434 --- .../hateoas/HypermediaAutoConfiguration.java | 1 + .../web/HttpMessageConverters.java | 3 + ...aAutoConfigurationWithoutJacksonTests.java | 55 ++++++++++++++++++ ...sAutoConfigurationWithoutJacksonTests.java | 56 +++++++++++++++++++ 4 files changed, 115 insertions(+) create mode 100644 spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/hateoas/HypermediaAutoConfigurationWithoutJacksonTests.java create mode 100644 spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/HttpMessageConvertersAutoConfigurationWithoutJacksonTests.java diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hateoas/HypermediaAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hateoas/HypermediaAutoConfiguration.java index 4a5b7b9a7f..02a2489513 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hateoas/HypermediaAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hateoas/HypermediaAutoConfiguration.java @@ -67,6 +67,7 @@ public class HypermediaAutoConfiguration { @Configuration @ConditionalOnMissingBean(LinkDiscoverers.class) + @ConditionalOnClass(ObjectMapper.class) @EnableHypermediaSupport(type = HypermediaType.HAL) protected static class HypermediaConfiguration { diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/HttpMessageConverters.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/HttpMessageConverters.java index 2a7ec72cee..7d46823c3b 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/HttpMessageConverters.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/HttpMessageConverters.java @@ -242,6 +242,9 @@ public class HttpMessageConverters implements Iterable> catch (ClassNotFoundException ex) { // Ignore } + catch (NoClassDefFoundError ex) { + // Ignore + } } } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/hateoas/HypermediaAutoConfigurationWithoutJacksonTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/hateoas/HypermediaAutoConfigurationWithoutJacksonTests.java new file mode 100644 index 0000000000..1c9b70ce2d --- /dev/null +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/hateoas/HypermediaAutoConfigurationWithoutJacksonTests.java @@ -0,0 +1,55 @@ +/* + * Copyright 2012-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.hateoas; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration; +import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration; +import org.springframework.boot.testutil.ClassPathExclusions; +import org.springframework.boot.testutil.FilteredClassPathRunner; +import org.springframework.mock.web.MockServletContext; +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; + +/** + * Tests for {@link HypermediaAutoConfiguration} when Jackson is not on the classpath. + * + * @author Andy Wilkinson + */ +@RunWith(FilteredClassPathRunner.class) +@ClassPathExclusions("jackson-*.jar") +public class HypermediaAutoConfigurationWithoutJacksonTests { + + private AnnotationConfigWebApplicationContext context; + + @Test + public void jacksonRelatedConfigurationBacksOff() { + this.context = new AnnotationConfigWebApplicationContext(); + this.context.register(BaseConfig.class); + this.context.setServletContext(new MockServletContext()); + this.context.refresh(); + } + + @ImportAutoConfiguration({ HttpMessageConvertersAutoConfiguration.class, + WebMvcAutoConfiguration.class, HypermediaAutoConfiguration.class }) + static class BaseConfig { + + } + +} diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/HttpMessageConvertersAutoConfigurationWithoutJacksonTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/HttpMessageConvertersAutoConfigurationWithoutJacksonTests.java new file mode 100644 index 0000000000..d03405dd1d --- /dev/null +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/HttpMessageConvertersAutoConfigurationWithoutJacksonTests.java @@ -0,0 +1,56 @@ +/* + * Copyright 2012-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.web; + +import org.junit.After; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.boot.testutil.ClassPathExclusions; +import org.springframework.boot.testutil.FilteredClassPathRunner; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link HttpMessageConvertersAutoConfiguration} without Jackson on the + * classpath. + * + * @author Andy Wilkinson + */ +@RunWith(FilteredClassPathRunner.class) +@ClassPathExclusions("jackson-*.jar") +public class HttpMessageConvertersAutoConfigurationWithoutJacksonTests { + + private AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); + + @After + public void close() { + if (this.context != null) { + this.context.close(); + } + } + + @Test + public void autoConfigurationWorksWithSpringHateosButWithoutJackson() + throws Exception { + this.context.register(HttpMessageConvertersAutoConfiguration.class); + this.context.refresh(); + assertThat(this.context.getBeansOfType(HttpMessageConverters.class)).hasSize(1); + } + +}