首页 > 解决方案 > 无法使用 Java API 访问数据中心服务

问题描述

我正在尝试使用 Java API 在我的数据中心服务上执行搜索。不幸的是,服务器返回了Unauthorized响应。这是代码:

  public Object doSearch() throws NoSuchAlgorithmException, KeyManagementException {
    String user = *****;
    String password = ******;
    String db = "data-hub-FINAL";
    String host = "***********.marklogicsvc.com";
    int port = 8011;
    SecurityContext auth = new DatabaseClientFactory.DigestAuthContext(user, password).withSSLContext(SSLContext.getDefault());
    DatabaseClient client = DatabaseClientFactory.newClient(host, port, db, auth);
    try {
      QueryManager qm = client.newQueryManager();
      StructuredQueryBuilder qb = qm.newStructuredQueryBuilder();
      qm.setPageLength(100);
      var query = qb.collection("listings");

      return qm.search(query, new SearchHandle());
    } finally {
      client.release();
    }
  }

我怀疑我使用了错误的凭据,但是当我在 Visual Studio Code Marklogic Extension 中尝试它们时效果很好,这是我的 VS Code 设置和查询:

    “marklogic.modulesDb”:“数据集线器模块”,
    "marklogic.host": "*******.marklogicsvc.com",
    "marklogic.password": *******,
    "marklogic.username": *******,
    “marklogic.ssl”:是的,
    “marklogic.port”:8011

询问:

xquery version "3.0";

declare namespace cts = "http://marklogic.com/cts";

cts:search(fn:collection(("listings")), cts:and-query(()))

如果您告诉我无法连接到 DHS 的 Java 代码有什么问题,我会非常高兴。

标签: javamarklogicmarklogic-dhf

解决方案


@rjrudin 的答案是正确的,但这里有一个完整的代码片段应该可以工作。

        SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
        X509TrustManager trustManager = new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
            }

            @Override
            public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];                
            }
        };
        sslContext.init(null, new TrustManager[] { trustManager }, null);

        return DatabaseClientFactory.newClient(
            host, port,
            new DatabaseClientFactory.BasicAuthContext(user, password).withSSLContext(sslContext, trustManager),
            DatabaseClient.ConnectionType.GATEWAY
        );

请注意该DatabaseClient.ConnectionType.GATEWAY参数,因为您通过负载均衡器与 DHS 连接。

另请注意,这不是在验证证书。对于生产实施,您可能希望在您的信任管理器中具有满足您的安全要求的逻辑。


推荐阅读