Anoop Deshpande
Anoop Deshpande

Reputation: 572

How to add XML namespace prefix in XML response of REST API in Spring Boot?

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

Answers (1)

Anoop Deshpande
Anoop Deshpande

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

Related Questions