【问题标题】:How to add XML namespace prefix in XML response of REST API in Spring Boot?如何在 Spring Boot 的 REST API 的 XML 响应中添加 XML 名称空间前缀?
【发布时间】:2022-12-10 07:24:00
【问题描述】:

我们有使用 Spring Boot 开发的 RESTful 服务。我们想要返回带有命名空间前缀的 XML 响应。

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;
    }
}

人.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;
}

预期响应:

<?xml version='1.0' encoding='UTF-8'?>
<ns2:person xmlns:ns2="abc.net/">
    <ns2:firstName>Jon</firstName>
    <ns2:lastName>Doe</lastName>
</ns2:person>

实际响应:

<?xml version='1.0' encoding='UTF-8'?>
<person xmlns="abc.net/">
    <firstName>Jon</firstName>
    <lastName>Doe</lastName>
</person>

MappingJackson2XmlHttpMessageConverter bean 创建

@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;
    }

我尝试将 @XmlSchema 放入包级别的 package-info.java 组件中,并带有所需的前缀和命名空间 URI,但没有成功。

我如何配置 Spring Boot XML 编组器以包括在 XML 响应中添加名称空间前缀 - 如上面的预期响应中所述?

我们使用的是 Spring Boot 版本:2.6.6。

【问题讨论】:

    标签: xml spring spring-boot jackson-databind jackson-dataformat-xml


    【解决方案1】:

    我们需要使用Jaxb2RootElementHttpMessageConverter而不是MappingJackson2XmlHttpMessageConverter。下面的 Bean 创建快照,

    @Bean
        public Jaxb2RootElementHttpMessageConverter jaxb2RootElementHttpMessageConverter() { return new Jaxb2RootElementHttpMessageConverter(); }
    

    似乎我们需要使用 Jaxb 转换器而不是 Jackson。

    【讨论】:

      猜你喜欢
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 2018-07-12
      相关资源
      最近更新 更多