Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';无法使用Java API访问数据中心服务_Java_Marklogic_Marklogic Dhf - Fatal编程技术网

Can';无法使用Java API访问数据中心服务

Can';无法使用Java API访问数据中心服务,java,marklogic,marklogic-dhf,Java,Marklogic,Marklogic Dhf,我正在尝试使用JavaAPI在我的数据中心服务上执行搜索。不幸的是,服务器返回未经授权的响应。 代码如下: public Object doSearch() throws NoSuchAlgorithmException, KeyManagementException { String user = *****; String password = ******; String db = "data-hub-FINAL"; String h

我正在尝试使用JavaAPI在我的数据中心服务上执行搜索。不幸的是,服务器返回
未经授权的
响应。
代码如下:

  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代码设置和查询:

"marklogic.modulesDb": "data-hub-MODULES", "marklogic.host": "*******.marklogicsvc.com", "marklogic.password": *******, "marklogic.username": *******, "marklogic.ssl": true, "marklogic.port": 8011
如果您告诉我我的Java代码有什么问题,我无法连接到DHS,我将非常高兴。

我相信您需要使用BasicAuthContext而不是DigestAuthContext,因为DHS使用基本身份验证

我猜您的SSL配置很好,但以防万一——我知道文档只显示正在设置的SSLContext——但我通常会传入X509TrustManager,并调用“WissLHostNameVerifier(DatabaseClientFactory.SSLHostnameVerifier.ANY)”。您可以使用X509TrustManager的impl,它接受所有测试内容


但是首先尝试一下BasicAuthContext,看看这是否解决了问题。

来自@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连接的

还请注意,这不是验证证书。对于生产实现,您希望信任管理器中的逻辑能够满足您的安全需求

        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
        );