要件: WebService インターフェイスから返された XML 文字列を Soap 経由で呼び出し、顧客は返された情報をデータベースに保存し、最終的に Web 上に表示するように要求します。
アイデア: 1. 対応するエンティティ クラスを作成します。目的は、返された情報内の有用な情報をエンティティ クラスにマップすることです。エンティティ クラスの属性は、XML 内の有用な情報フィールドと一致している必要があります。2: RestTemplate を使用してリクエストを送信し、リクエスト ヘッダー パラメータと対応する WebService インターフェイス アドレスを設定し、データをリクエストします。3. dom4j を使用して、返された XML 文字列を解析します。4. ストレージ操作を実装します。
具体的な実装:
1 エンティティクラスを作成する
/**
* @Description: saop映射实体类
* @Title: XxVo
* @Package com.example.entity
* @Author: ytsj
* @CreateTime: 2023/1/16 16:43
*/
@Data
public class XxVo{
private String asd;
private String dfd;
private String gfg;
private String hgg;
}
2: RestTemplate を使用して、インターフェイスから返されたデータを取得するリクエストを送信します。リクエスト ヘッダーのパラメーターは、インターフェイスで必要なパラメーターと一致していることに注意してください。インターフェイスに必要なパラメーターはすべて渡すことができます。ここでは、ユーザー名とパスワードもインターフェイスに渡す必要があります。
@GetMapping("/getXmlData")
public ResultEntity getXmlData() throws Exception {
String url = " ";// WebService接口地址
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType("text/xml;charset=utf-8"); // 设置Content-Type
headers.add("Accept-Encoding", "gzip, deflate, br");//设置Accept-Encoding
// 请求头需要传递用户名和密码
headers.add("password", "");
headers.add("username", "");
//这里是发生请求时body中的raw类型为xml的参数,使用StringBuffer进行拼接
StringBuffer xmlParam = new StringBuffer();
xmlParam.append("");
//请求体
HttpEntity<String> formEntity = new HttpEntity<>(xmlParam.toString(), headers);
//发送数据方法
ResponseEntity<String> forEntity = restTemplate.postForEntity(url, formEntity, String.class);
//得到返回的数据body
String jsonData = forEntity.getBody();
//组织返回的数据
List<XxVo> vos = getChildResult(jsonData);
return ResultEntity.ok(vos);
}
本体内の raw のタイプは、 xml によって
返されたデータです
3: 返されたデータを解析する
/**
* @description 通过递归调用组织的数据
* @methodName getChildResult
* @param [jsonData]
* @return java.util.List<com.example.XxVo>
* @date: 2023/1/18 11:17
* @author ytsj
*/
public static List<XxVo> getChildResult(String jsonData) throws UnsupportedEncodingException, DocumentException, InstantiationException, IllegalAccessException, NoSuchMethodException {
SAXReader reader = new SAXReader();
Document document = reader.read(new ByteArrayInputStream(jsonData.getBytes("UTF-8")));
XxVo vo = new XxVo();
Element rootElement = document.getRootElement();// 根节点
List arrayList = new ArrayList<>();
List<XxVo> childElement = getChildElement(rootElement, XxVo.class, vo , arrayList);
return childElement;
}
/**
* @param [elem, clazz, t, list]
* @return java.util.List<T>
* @description 递归遍历子节点
* @methodName getChildElement
* @date: 2023/1/18 10:09
* @author ytsj
*/
private static <T> List<T> getChildElement(Element elem, Class clazz, T t, List<T> list) throws InstantiationException, IllegalAccessException, NoSuchMethodException {
List<Element> elems = elem.elements();
for (Element ele : elems) {
if (ele.getName().equals("item")) {
List<Element> content = ele.content();
t = (T) clazz.newInstance();
for (Element element : content) {
// 通过反射获取该类的所有属性
Field[] fields = clazz.getDeclaredFields();
for (int x = 0; x < fields.length; x++) {
Field field = fields[x]; //获取该类的属性
if (field.getName().equals(element.getName())) {
field.setAccessible(true); // 设置属性可访问的
field.set(t, element.getText());
break;
}
}
list.add(t);
}
}
if (ele.elements().size() > 0) { // 说明还存在子节点,继续遍历
getChildElement(ele, clazz, t, list);
}
}
return list;
}
上記の方法をベースに少し変更した別の方法がより理解しやすくなる可能性があり、個人的にはそう思います。はは〜
/**
* @return java.util.List<com.example.XxVo>
* @description 递归调用
* @methodName getChildResult
* @date: 2023/1/17 16:07
* @author ytsj
*/
public List<XxVo> getChildResult(String xmlStr) {
SAXReader sax = new SAXReader();
List<XxVo> xxVos= new ArrayList<>();
try {
Document doc = sax.read(new ByteArrayInputStream(xmlStr.getBytes(StandardCharsets.UTF_8)));
Element root = doc.getRootElement();
//递归遍历节点
searchDoc(root, xxVos);
return xxVos;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 递归获取xml文件信息
*
* @param elem
* @param <T>
*/
private <T> void searchDoc(Element elem, List<XxVo> vos) {
List<Element> elems = elem.elements();
for (Element ele : elems) {
if (ele.getName().equals("item")) {
try {
// 创建一个新类
XxVo vo = new XxVo();
// 获取该类的所有属性
Field[] fields = XxVo.class.getDeclaredFields();
List<Element> content = ele.content();
for (Element element : content) {
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
if (field.getName().equals(element.getName())) {
field.setAccessible(true);
field.set(vo , element.getText());
break;
}
}
}
vos.add(vo);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
if (ele.elements().size() > 0) {
searchDoc(ele, vos);
}
}
}
解析されたデータを
データベースに保存します。ウェアハウジングの操作は、新しいメソッドを作成し、バッチ挿入するだけです。
これはこの要件に対する私の具体的な認識です。より良い方法がある場合は、共有してください。
上記の説明が間違っている場合は、修正していただけます。ご質問がある場合は、v 876942434 を追加してください。