> 文章列表 > 4、SpringBoot接收和响应xml报文请求

4、SpringBoot接收和响应xml报文请求

4、SpringBoot接收和响应xml报文请求

背景

平时开发的接口,基本是使用 json 格式的请求报文。然而,有时候也避免不了有 xml 报文请求的场景,最近就遇到了这种情况,在此记录下。另外,工程中使用的是 controller-service……这种结构。

xml请求报文:

<?xml version="1.0" encoding="UTF-8" ?>

<req>

  <tel>15556905765</tel>

  <activityid></activityid>

  <timestamp>1603383430</timestamp>

</req>

xml响应报文:

<?xml version="1.0" encoding="UTF-8" ?>

<resp>

    <code>200</code>

    <msg></msg>

    <activeflag></activeflag>

</resp>

实现步骤

第一步,引入必需依赖

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.10</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId><version>2.14.1</version>
</dependency>

在 jackson-dataformat-xml 包里提供了一系列的 json 与 xml 互转的 API。当定义请求或响应类时,使用 @JacksonXml 开头的注解,可以实现 xml 标签字段与 javabean 字段之间的映射。

第二步,自定义请求类和响应类

自定义请求类:

@Data
@JacksonXmlRootElement(localName = "req")
public class TestRequest {//手机号@JacksonXmlProperty(localName = "tel")private String tel;//活动商品ID@JacksonXmlProperty(localName = "activityId")private String productId;@JacksonXmlProperty(localName = "timestamp")private Long timestamp;
}

自定义响应类:

@Data
@JacksonXmlRootElement(localName = "resp")
public class TestResponse {//返回码@JacksonXmlProperty(localName = "code")private String code;//返回码信息描述@JacksonXmlProperty(localName = "msg")private String msg;//可参与活动标志 :1-可参与 2-不可参与@JacksonXmlProperty(localName = "activeflag")private String activeFlag;
}

注意,当xml与实体类的一些字段名称相同时,这些字段可以不使用@JacksonXmlProperty注解。

第三步,编写控制器类和业务逻辑

TestController:

@RestController
public class TestController {@Resourceprivate TestService testService;@PostMapping(value = "/test", produces = MediaType.APPLICATION_XML_VALUE)public String test(@RequestBody TestRequest request){return testService.service(request);}
}

TestService:

@Slf4j
@Service
public class TestService {public String service(TestRequest request){//request入参校验 .... 省略//正常情况TestResponse response = new TestResponse();response.setCode("200");response.setMsg("allow sub");response.setActiveFlag("1");return javaBeanToXml(response);}
}

第四步,编写 javabean 转 xml 方法

//XML文件头
private static final String XML_HEAD = "<?xml version=\\"1.0\\" encoding=\\"UTF-8\\" ?>\\n";public static String javaBeanToXml(Object obj)
{String xml = "";if (Objects.isNull(obj)){return xml;}try{XmlMapper xmlMapper = new XmlMapper();xml = xmlMapper.writeValueAsString(obj);} catch (Exception e){log.error("javaBeanToXml error, obj={}, xml={}", obj, xml, e);return "";}// 添加xml文件头return XML_HEAD + xml;
}

自测

这里,使用 postman 工具测试(Body->raw->XML)

效果如下:

 特此记录下,就这样~