Reputation: 572
We have RESTful service developed using Spring Boot. We want to return XML response with namespace prefix.
PersonsController.java
@Controller
@RequestMapping("/persons")
public class PersonsController {
@GetMapping
public @ResponseBody Person getPerson() {
Person person = new Person();
person.setFirstName("Jon");
person.setLastName("Doe");
return person;
}
}
Person.java
@NoArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "person", namespace = "abc.net/")
public class Person {
@XmlElement(namespace = "abc.net/")
private String firstName;
@XmlElement(namespace = "abc.net/")
private String lastName;
}
Expected response:
<?xml version='1.0' encoding='UTF-8'?>
<ns2:person xmlns:ns2="abc.net/">
<ns2:firstName>Jon</firstName>
<ns2:lastName>Doe</lastName>
</ns2:person>
Actual response:
<?xml version='1.0' encoding='UTF-8'?>
<person xmlns="abc.net/">
<firstName>Jon</firstName>
<lastName>Doe</lastName>
</person>
MappingJackson2XmlHttpMessageConverter bean creation
@Bean
MappingJackson2XmlHttpMessageConverter getMappingJackson2XmlHttpMessageConverter() {
JaxbAnnotationModule jaxbAnnotationModule = new JaxbAnnotationModule();
MappingJackson2XmlHttpMessageConverter mappingJackson2XmlHttpMessageConverter = new MappingJackson2XmlHttpMessageConverter();
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);
mappingJackson2XmlHttpMessageConverter.setObjectMapper(xmlMapper);
mappingJackson2XmlHttpMessageConverter.getObjectMapper().registerModule(jaxbAnnotationModule);
return mappingJackson2XmlHttpMessageConverter;
}
I tried putting @XmlSchema
in package-info.java
component at the package level with required prefix & namespaceURI, but no luck.
How can I configure the Spring Boot XML marshaller to include adding of namespace prefix in XML response - as mentioned in the expected response above?
We are using Spring Boot version: 2.6.6.
Upvotes: 1
Views: 1360
Reputation: 572
We need to use Jaxb2RootElementHttpMessageConverter
instead of MappingJackson2XmlHttpMessageConverter
. Bean creation snapshot below,
@Bean
public Jaxb2RootElementHttpMessageConverter jaxb2RootElementHttpMessageConverter() { return new Jaxb2RootElementHttpMessageConverter(); }
Seems like we need to use Jaxb convertor instead of Jackson.
Upvotes: 1