diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java
index d9f58e99ef..e6eb1d9f9a 100644
--- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java
+++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java
@@ -25,6 +25,7 @@ import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import javax.ws.rs.ext.ContextResolver;
+import javax.xml.bind.annotation.XmlElement;
import com.fasterxml.jackson.databind.AnnotationIntrospector;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -39,6 +40,7 @@ import org.glassfish.jersey.servlet.ServletContainer;
import org.glassfish.jersey.servlet.ServletProperties;
import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
@@ -201,17 +203,14 @@ public class JerseyAutoConfiguration implements ServletContextAware {
}
+ @Configuration(proxyBeanMethods = false)
@ConditionalOnClass(JacksonFeature.class)
@ConditionalOnSingleCandidate(ObjectMapper.class)
- @Configuration(proxyBeanMethods = false)
static class JacksonResourceConfigCustomizer {
- private static final String JAXB_ANNOTATION_INTROSPECTOR_CLASS_NAME = "com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector";
-
@Bean
public ResourceConfigCustomizer resourceConfigCustomizer(
final ObjectMapper objectMapper) {
- addJaxbAnnotationIntrospectorIfPresent(objectMapper);
return (ResourceConfig config) -> {
config.register(JacksonFeature.class);
config.register(new ObjectMapperContextResolver(objectMapper),
@@ -219,16 +218,12 @@ public class JerseyAutoConfiguration implements ServletContextAware {
};
}
- private void addJaxbAnnotationIntrospectorIfPresent(ObjectMapper objectMapper) {
- if (ClassUtils.isPresent(JAXB_ANNOTATION_INTROSPECTOR_CLASS_NAME,
- getClass().getClassLoader())) {
- new ObjectMapperCustomizer().addJaxbAnnotationIntrospector(objectMapper);
- }
- }
+ @Configuration
+ @ConditionalOnClass({ JaxbAnnotationIntrospector.class, XmlElement.class })
+ static class JaxbObjectMapperCustomizer {
- private static final class ObjectMapperCustomizer {
-
- private void addJaxbAnnotationIntrospector(ObjectMapper objectMapper) {
+ @Autowired
+ public void addJaxbAnnotationIntrospector(ObjectMapper objectMapper) {
JaxbAnnotationIntrospector jaxbAnnotationIntrospector = new JaxbAnnotationIntrospector(
objectMapper.getTypeFactory());
objectMapper.setAnnotationIntrospectors(
diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfigurationTests.java
index f78ab06053..b6a3756ff3 100644
--- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfigurationTests.java
+++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfigurationTests.java
@@ -16,12 +16,16 @@
package org.springframework.boot.autoconfigure.jersey;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector;
import org.glassfish.jersey.server.ResourceConfig;
import org.junit.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
+import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;
import org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener;
import org.springframework.boot.logging.LogLevel;
+import org.springframework.boot.test.context.FilteredClassLoader;
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
@@ -72,6 +76,48 @@ public class JerseyAutoConfigurationTests {
});
}
+ @Test
+ public void whenJaxbIsAvailableTheObjectMapperIsCustomizedWithAnAnnotationIntrospector() {
+ this.contextRunner
+ .withConfiguration(AutoConfigurations.of(JacksonAutoConfiguration.class))
+ .run((context) -> {
+ ObjectMapper objectMapper = context.getBean(ObjectMapper.class);
+ assertThat(objectMapper.getSerializationConfig()
+ .getAnnotationIntrospector().allIntrospectors().stream()
+ .filter(JaxbAnnotationIntrospector.class::isInstance))
+ .hasSize(1);
+ });
+ }
+
+ @Test
+ public void whenJaxbIsNotAvailableTheObjectMapperCustomizationBacksOff() {
+ this.contextRunner
+ .withConfiguration(AutoConfigurations.of(JacksonAutoConfiguration.class))
+ .withClassLoader(new FilteredClassLoader("javax.xml.bind.annotation"))
+ .run((context) -> {
+ ObjectMapper objectMapper = context.getBean(ObjectMapper.class);
+ assertThat(objectMapper.getSerializationConfig()
+ .getAnnotationIntrospector().allIntrospectors().stream()
+ .filter(JaxbAnnotationIntrospector.class::isInstance))
+ .isEmpty();
+ });
+ }
+
+ @Test
+ public void whenJacksonJaxbModuleIsNotAvailableTheObjectMapperCustomizationBacksOff() {
+ this.contextRunner
+ .withConfiguration(AutoConfigurations.of(JacksonAutoConfiguration.class))
+ .withClassLoader(
+ new FilteredClassLoader(JaxbAnnotationIntrospector.class))
+ .run((context) -> {
+ ObjectMapper objectMapper = context.getBean(ObjectMapper.class);
+ assertThat(objectMapper.getSerializationConfig()
+ .getAnnotationIntrospector().allIntrospectors().stream()
+ .filter(JaxbAnnotationIntrospector.class::isInstance))
+ .isEmpty();
+ });
+ }
+
@Configuration(proxyBeanMethods = false)
static class ResourceConfigConfiguration {
diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-jersey/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-jersey/pom.xml
index 8138e75242..c812e5915b 100644
--- a/spring-boot-project/spring-boot-starters/spring-boot-starter-jersey/pom.xml
+++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-jersey/pom.xml
@@ -113,6 +113,10 @@
org.glassfish.jersey.media
jersey-media-json-jackson
+
+ javax.xml.bind
+ jaxb-api
+