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)
效果如下:
特此记录下,就这样~