【问题标题】:Appending xml on spring boot response在 Spring Boot 响应上附加 xml
【发布时间】:2020-10-29 14:22:35
【问题描述】:

所以我有这个控制器。我在响应中附加了一个 xml 字符串,它也是 xml。

@GetMapping(value = "/testxml", consumes = { MediaType.APPLICATION_XML_VALUE }, 
        produces = { MediaType.APPLICATION_XML_VALUE })
public ResponseData getXml(@RequestBody RequestData rData) {

    
    String xml = "<TEST><INNER_TEST>test</INNER_TEST></TEST>";
    ResponseData response = new ResponseData();
    response.setAge(rData.getAge());
    response.setXml(xml);
    response.setName(rData.getName());
    return response;
}

我期待这个:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<responseData>
    <age>17</age>
    <name>sample</name>
    <xml><TEST><INNER_TEST>test</INNER_TEST></TEST></xml>
</responseData>

但得到了这个:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<responseData>
    <age>17</age>
    <name>sample</name>
    <xml>&lt;TEST&gt;&lt;INNER_TEST&gt;test&lt;/INNER_TEST&gt;&lt;/TEST&gt;</xml>
</responseData>

现在,我知道当 spring boot 编组响应时 (以及其他)会转换为转义字符,但是有没有办法忽略给定的:

-xml 可以是任何形式的 xml。没有格式。可以是 QWERTY 或 12345 或任何东西,只要它是 xml。 - 不能使用 CDATA。必须保留任何 xml 字符串的父响应格式

【问题讨论】:

  • 编组时不会。仅当您自己手动编写 XML 时。最好的解决方案是使用 CDATA。
  • 哦,好吧。我在 getter (response.getXML()) 上尝试了@XmlCDATA,但它仍然得到响应。有什么想法吗?
  • 不确定这是否是默认的 Jaxb 注释。还有什么是用来创建 XML... Jaxb 还是您使用 Jackson...
  • 我认为 spring-boot 使用 jackson,但不是 100% 确定。
  • 找到了解决办法,请看下面的答案...

标签: java xml spring spring-boot


【解决方案1】:

答案:

在您的配置类 (@Configuration) 上使用它来覆盖 xml 编组,这样它就不会转义字符。

@Bean
public HttpMessageConverter<Object> messageConverter() {
    return new MarshallingHttpMessageConverter(getJaxb2Marshaller());
}

@Bean
public Jaxb2Marshaller getJaxb2Marshaller() {
    Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
    Map<String, Object> map = new HashMap<String, Object>();
    jaxb2Marshaller.setClassesToBeBound(TestModel.class);
    map.put(CharacterEscapeHandler.class.getName(),
            new CharacterEscapeHandler() {
                @Override
                public void escape(char[] ac, int i, int j, boolean flag,
                                   Writer writer) throws IOException {
                    writer.write(ac, i, j);
                }
            });
    jaxb2Marshaller.setMarshallerProperties(map);

    return jaxb2Marshaller;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2019-03-15
    • 2022-01-23
    • 2016-07-23
    • 2020-03-09
    • 2018-06-02
    • 2022-12-10
    相关资源
    最近更新 更多