构建xml报文
描述:以前个人构建xml报文,一般会利用递归算法通过StringBuffer来进行拼接。这种情况,不需要开发者写任何的xml模板,只需要在代码层面维护参数与参数之间的关系。但是这对开发者来说,构建入参的维护需要格外仔细。同时拼接处理逻辑同样需要写大量的代码。这次用的方式通过维护xml模板与注解的方式来构建,注解是现有的jar包依赖,无需个人再次编写。
1.在xml模板通过 {name} 占位符的形式,表示需要自定义的,具体模板根据实际情况决定(构建xml报文无需注解)
<?xml version="1.0" encoding="UTF-8"?>
<service>
<service_header>
<!--这个参数就根据实际入参决定-->
<service_sn>{service_sn}</service_sn>
<service_id>1001</service_id>
</service_header>
<service_body>
<request>
<name>{name}</name>
<age>{age}</age>
</request>
</service_body>
</service>
2.代码层面还是需要通过map来维护一份自定义的参数与值,key就是占位符写的name,需要保持一致,value就会被填充进去。
Map<String ,Object> pa = new HashMap<>(4);
pa.put("service_sn",System.currentTimeMillis());
pa.put("name","张三");
pa.put("age","10");
3.使用的方法是hutool工具类
String req = IoUtil.read(new ClassPathResource("xml/1001Req.xml").getInputStream(), StandardCharsets.UTF_8);
String reqXml = StrUtil.format(req, pa);
log.info("原生请求报文:[{}]", reqXml);
结果如下:
<?xml version="1.0" encoding="UTF-8"?>
<service>
<service_header>
<!--这个参数就根据实际入参决定-->
<service_sn>1698200396409</service_sn>
<service_id>1001</service_id>
</service_header>
<service_body>
<request>
<name>张三</name>
<age>10</age>
</request>
</service_body>
</service>
解析xml报文
1.获取xml报文
String res = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<service>\n" +
" <service_header>\n" +
" <!--这个参数就根据实际入参决定-->\n" +
" <service_sn>1698395245218</service_sn>\n" +
" <service_id>1001</service_id>\n" +
" </service_header>\n" +
" <service_body>\n" +
" <name>张三</name>\n" +
" <age>10</age>\n" +
" </service_body>\n" +
"</service>";
引用依赖
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.11.2</version>
</dependency>
2.根据报文格式定义实体对象
@Data
@AllArgsConstructor
@NoArgsConstructor
@JacksonXmlRootElement(localName = "Service")
public class ID1001 {
@JacksonXmlProperty(localName = "service_header")
private Header serviceHeader;
@JacksonXmlProperty(localName = "service_body")
private Body serviceBody;
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class Header {
@JacksonXmlProperty(localName = "service_sn")
private String serviceSn;
@JacksonXmlProperty(localName = "service_id")
private String serviceId;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class Body {
@JacksonXmlProperty(localName = "name")
private String name;
@JacksonXmlProperty(localName = "age")
private String age;
}
3.解析xml映射到实体对象
/**
* 解析响应xml报文
*
* @param resXml 响应报文
* @return
*/
public static ID1001 res1001xml(String resXml) throws JsonProcessingException {
ID1001 response = getxmlMapper().readValue(resXml, ID1001.class);
return response;
}
public static XmlMapper getxmlMapper() {
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return xmlMapper;
}
4.解析实体对象赋值后如下
{
"serviceBody":{
"age":"10",
"name":"张三"
},
"serviceHeader":{
"serviceId":"1001",
"serviceSn":"1698395245218"
}
}