首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Odoo (OpenERP) 開發實踐:Java 通過 XML-RPC 操作數據庫

     編輯:關於C++

概述

Odoo 服務器提供 XML-RPC 接口,允許外部系統創建、讀取、更新、刪除數據庫記錄。本文演示使用 Java (Apache XML-RPC Client) 連接 Odoo 8.0 並操作 res.partner 模型(客戶/合作夥伴)。

依賴庫

  • xmlrpc-common-3.1.3.jar
  • xmlrpc-client-3.1.3.jar
  • ws-commons-util-1.0.2.jar

完整示例代碼

package memo.by.weichen;

import java.net.URL;
import java.util.*;
import org.apache.xmlrpc.client.*;

public class OdooWSDemo {
    public static final String URL = "https://127.0.0.1:8069";
    public static final String DB = "demo";
    public static final int USER_ID = 1;
    public static final String PASS = "demo";

    public static void main(String[] args) throws Exception {
        XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
        XmlRpcClient client = new XmlRpcClient();
        config.setServerURL(new URL(String.format("%s/xmlrpc/2/object", URL)));
        client.setConfig(config);

        // 1. 創建客戶
        Map<String, Object> vals = new HashMap<>();
        vals.put("name", "蘇州園區永旺夢樂城");
        vals.put("customer", true);
        Integer id = (Integer) client.execute("execute_kw", Arrays.asList(
            DB, USER_ID, PASS, "res.partner", "create", Arrays.asList(vals)
        ));
        System.out.println("Created partner ID: " + id);

        // 2. 更新客戶
        Map<String, Object> updateVals = new HashMap<>();
        updateVals.put("name", "永旺夢樂城蘇州園區店");
        client.execute("execute_kw", Arrays.asList(
            DB, USER_ID, PASS, "res.partner", "write", 
            Arrays.asList(Arrays.asList(id), updateVals)
        ));
        System.out.println("Updated partner name.");

        // 3. 查詢客戶 (搜索 + 讀取)
        List<Object> domain = Arrays.asList(Arrays.asList("name", "ilike", "永旺"));
        List<Integer> ids = (List<Integer>) client.execute("execute_kw", Arrays.asList(
            DB, USER_ID, PASS, "res.partner", "search", Arrays.asList(domain)
        ));
        if (!ids.isEmpty()) {
            List<String> fields = Arrays.asList("name", "phone", "email");
            List<Map<String, Object>> partners = (List<Map<String, Object>>) 
                client.execute("execute_kw", Arrays.asList(
                    DB, USER_ID, PASS, "res.partner", "read", 
                    Arrays.asList(ids, fields)
                ));
            for (Map<String, Object> p : partners) {
                System.out.println("Partner: " + p);
            }
        }
    }
}

關鍵點解析

  1. 端點區分:/xmlrpc/2/object 用於模型操作 (create, write, search, read, unlink);/xmlrpc/2/common 用於認證 (login, version)。
  2. execute_kw 參數結構:[db, uid, password, model, method, args..., kwargs?]。
  3. 域過濾器:[["field", "operator", "value"], ...],運算符包括 =, !=, >, <, like, ilike, in, not in, child_of 等。
  4. 數據類型映射:Java Map ↔ Odoo 記錄字典,List ↔ 陣列/列表,基本類型自動轉換。

常見問題與技巧

  • 大數據量分頁:search 支持 offset, limit, order 關鍵字參數。
  • 關聯字段:讀取時指定 fields 可獲取關聯記錄的 ID 或完整對象(取決於字段類型)。
  • 異常處理:網絡超時、認證失敗、權限不足均會拋出 XmlRpcException,需妥善捕獲。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved