背景

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

xml请求报文:

  15556905765

  

  1603383430

xml响应报文:

    200

    

    

实现步骤

第一步,引入必需依赖

org.projectlombok

lombok

1.16.10

com.fasterxml.jackson.dataformat

jackson-dataformat-xml

2.14.1

在 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 {

@Resource

private 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 = "\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)

效果如下:

 特此记录下,就这样~

查看原文