Java は、Soap を介して WebService インターフェイスを呼び出すことによって返されたデータを解析し、それを最終ストレージ用の対応するエンティティにマップします。

要件: 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 を追加してください。

おすすめ

転載: blog.csdn.net/fortunate_leixin/article/details/128724277