1

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.

1 Answer 1

1

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.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.