简体   繁体   English

如何转义 jaxb 生成的 xml 字符串中的双引号

[英]how to escape double quote in xml String generated by jaxb

Basically I need to build an xml file and then submit the xml request to a restTemplate post action as follows:基本上我需要构建一个 xml 文件,然后将 xml 请求提交给 restTemplate post 操作,如下所示:

final RestTemplate restTemplate1 = new RestTemplate();
        List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        converter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_XML));
        messageConverters.add(converter);
        restTemplate1.setMessageConverters(messageConverters);
    HttpHeaders headers = new HttpHeaders();
    headers.setBasicAuth("okmAdmin", "admin");
    headers.setContentType(MediaType.APPLICATION_XML);


    JAXBContext context = null;
    context = JAXBContext.newInstance(Folder.class);
    Marshaller mar = null;
    mar = context.createMarshaller();
    mar.setProperty("jaxb.encoding", "Unicode");
    mar.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.FALSE);

    //Print XML String to Console
    StringWriter sw = new StringWriter();

    Folder folder = new Folder();
    folder.setPath("/okm:root/test4");

    //Write XML to StringWriter
    mar.marshal(folder, sw);

    String xmlContent = sw.toString();

    System.out.println(xmlContent);

    HttpEntity<String> request = new HttpEntity<String>(xmlContent, headers);

    ResponseEntity<Folder> response = restTemplate1.postForEntity("http://localhost:8080/OpenKM/services/rest/folder/create", request, Folder.class);

The xml generated is as follows:生成的xml如下:

<?xml version="1.0" encoding="Unicode" standalone="yes"?><folder><path>/okm:root/test4</path><permissions>0</permissions><subscribed>false</subscribed><hasChildren>false</hasChildren><style>0</style></folder>

However when the xml is submitted by the resttemplate,I got the following errors:然而,当 resttemplate 提交 xml 时,出现以下错误:

2022-12-05 16:50:21.121 ERROR 15764 --- [nio-8082-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.HttpClientErrorException$BadRequest: 400 : "JAXBException occurred : Unexpected character '"' (code 34) in prolog; expected '<'<EOL> at [row,col {unknown-source}]: [1,1]. "] with root cause

Based on the error message it looks like i need to escape the double quote.根据错误消息,我似乎需要转义双引号。

How can I escape it pls?我怎样才能逃脱它?

Try using StringEscapeUtils.escapeXml() like the following:尝试像下面这样使用 StringEscapeUtils.escapeXml() :

HttpEntity<String> request = new HttpEntity<String>(StringEscapeUtils.escapeXml(xmlContent), headers);

I manage to fix the issue by changing the following code: remove this:我设法通过更改以下代码来解决此问题:删除此代码:

MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();

Added this:添加了这个:

 messageConverters.add(new StringHttpMessageConverter());

And instead of casting the object to Folder I have used String:我没有将 object 转换为文件夹,而是使用了字符串:

     ResponseEntity<String> response = restTemplate1.postForEntity("http://localhost:8080/OpenKM/services/rest/folder/create", request, String.class);

The complete code is as follows:完整代码如下:

final RestTemplate restTemplate1 = new RestTemplate();
        List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
        messageConverters.add(new StringHttpMessageConverter());

    restTemplate1.setMessageConverters(messageConverters);

        HttpHeaders headers = new HttpHeaders();
        headers.setBasicAuth("okmAdmin", "admin");
        headers.setContentType(MediaType.APPLICATION_XML);


        JAXBContext context = null;
        context = JAXBContext.newInstance(Folder.class);
        Marshaller mar = null;
        mar = context.createMarshaller();

        mar.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.FALSE);

        //Print XML String to Console
        StringWriter sw = new StringWriter();

        Folder folder = new Folder();
        folder.setPath("/okm:root/test23");

        //Write XML to StringWriter
        mar.marshal(folder, sw);


        HttpEntity<String> request = new HttpEntity<String>(xmlString, headers);


        ResponseEntity<String> response = restTemplate1.postForEntity("http://localhost:8080/OpenKM/services/rest/folder/create", request, String.class);

        System.out.println(response);


    }

I am adding this in case if someone else have the same issue.如果其他人有同样的问题,我会添加这个。

Thanks谢谢

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM