gpt4 book ai didi

java - 如何在 Spring RestTemplate 中自定义自动编码(marshal)处理以生成/修改 XML header (编码、DOCTYPE)

转载 作者:行者123 更新时间:2023-12-01 20:02:43 25 4
gpt4 key购买 nike

我想了解如何影响 Spring 在通过 RestTemplate 发送 POST 请求时如何自动将 Java 对象编码为 XML 。特别是,如何配置 XML header 中的内容( encodingDOCTYPE 、...)。

有很多问题与主题密切相关( Include DOCTYPE for Spring Jaxb2MarshallerHow to add DOCTYPE and xml processing instructions when marshalling with JAXB?how to add DOCTYPE in jaxb marshallerHow to declare doctype ,xml version and encoding in XML file using DOM parser in java? ),但似乎没有一个在这里有帮助。

enter image description here

我知道我可以先将对象编码为 XML 字符串,然后发送 XML 字符串。不过,我想使用自动编码,因为它看起来更优雅和更合适。

我有一个类似的类(class)

@XmlRootElement(name = "MyRequest")
public class MyRequest {
@XmlAttribute(required = true)
String field1;
@XmlAttribute(required = true)
String field2;
...
}

发送 HTTP POST 请求的代码如下:

final MyRequest requestBody = new MyRequest("VALUE1", "VALUE2");

final HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_XML);
headers.setAccept(Arrays.asList(MediaType.APPLICATION_XML, MediaType.ALL));
final HttpEntity<MyRequest> requestHttpEntity = new HttpEntity<>(requestBody, headers);

return restTemplate.postForEntity(url, requestHttpEntity, MyResponse.class);

当我拦截发送的内容时,它是这样的:

POST /webservice HTTP/1.1
Accept: application/xml, */*
Content-Type: application/xml
Host: example.com:8080
Content-Length: ...

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MyRequest field1="VALUE1" field2="VALUE2">
</MyRequest>

我想要收到的是

POST ...

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE MyRequest SYSTEM "MyRequest.dtd">
<MyRequest field1="VALUE1" field2="VALUE2">
</MyRequest>

问题:如何在不完全避免 Spring RestTemplate 的自动行为的情况下自定义编码(marshal)处理? 我想更改 encoding ,删除 standalone属性(它从哪里来?)并添加 <!DOCTYPE>元素。

最佳答案

您可以将 RestTemplate 使用的 XML 转换器替换为自定义的转换器:

RestTemplate restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();
for (int i = 0; i != converters.size(); i++) {
if (converters.get(i) instanceof Jaxb2RootElementHttpMessageConverter) {
Jaxb2RootElementHttpMessageConverter xmlConverter = new Jaxb2RootElementHttpMessageConverter(){
@Override
protected void customizeMarshaller(Marshaller marshaller) {
marshaller.setProperty( "com.sun.xml.internal.bind.xmlHeaders", "<!DOCTYPE MyRequest SYSTEM \"MyRequest.dtd\">");
// add other customizations
}
};
converters.set(i, xmlConverter);
break;
}
}

将整个内容包装在用 @Bean @Qualified 注释的方法中,如果您有很多地方可以注入(inject)它,则可以使用它在需要的地方 Autowiring RestTemplate

关于java - 如何在 Spring RestTemplate 中自定义自动编码(marshal)处理以生成/修改 XML header (编码、DOCTYPE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47836310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com