Force the use JAXB with Spring Boot
The issue
In my case I was producing the sitemap.xml of this website and I had configured Jackson XML in my Spring Boot configuration.
The problem of the result was that by default Jackson add an empty namespace (xmlns=""
) for every node in the xml.
Google didn't like this value and refused to parse the xml. This is an old and open issue for Jackson.
GitHub link to the issue: https://github.com/FasterXML/jackson-dataformat-xml/issues/355
Jaxb is an alternative
Jaxb doesn't present this issue and I used it in the past How to generate a sitemap with Java.
In the pom.xml
I have the Jaxb libraries:
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>4.0.2</version>
<scope>runtime</scope>
</dependency>
Tell Spring Boot to use Jaxb
In Spring you can define which converter to use to produce a result, ex. XML, using HttpMessageConverters
In our case we want to define an additional converter:
public HttpMessageConverters(HttpMessageConverter<?>... additionalConverters)
We ask Spring to add the Jaxb Message Converter
@Configuration
public class XmlConfiguration {
@Bean
public HttpMessageConverters customConverters() {
HttpMessageConverter<?> additionalConverter = new Jaxb2RootElementHttpMessageConverter();
return new HttpMessageConverters(additionalConverter);
}
}
With this change we use the JAXB converter that according to the documentation : This converter can read classes annotated with XmlRootElement and XmlType, and write classes annotated with XmlRootElement, or subclasses thereof.