Java 获取com.marklogic.client.FailedRequestException无效参数:无效的查询结构(检查命名空间)

Java 获取com.marklogic.client.FailedRequestException无效参数:无效的查询结构(检查命名空间),java,marklogic,nosql,Java,Marklogic,Nosql,我不熟悉Marklogic,可能遗漏了一些东西。我使用的是MarkLogic 7.0,java客户端api 2.0.5。创建了一个新的REST实例后,我正在尝试运行Marklogic提供的示例代码: DatabaseClient client = DatabaseClientFactory.newClient("some.host.com", 8006, "user", "****", DatabaseClientFactory.Authentication.DIGEST); J

我不熟悉Marklogic,可能遗漏了一些东西。我使用的是MarkLogic 7.0,java客户端api 2.0.5。创建了一个新的REST实例后,我正在尝试运行Marklogic提供的示例代码:

DatabaseClient client = 
  DatabaseClientFactory.newClient("some.host.com", 8006, "user", "****", 
    DatabaseClientFactory.Authentication.DIGEST);
JSONDocumentManager doc = client.newJSONDocumentManager();
doc.write(
  "hello.json", 
  new StringHandle("{\"recipient\": \"world\", \"message\": \"Hello, world!\"}"));

QueryManager query = client.newQueryManager();
StructuredQueryBuilder b = query.newStructuredQueryBuilder();
SearchHandle results = 
  query.search(
    b.and(b.term("hello"), b.value(b.jsonKey("recipient"), "world")), 
    new SearchHandle());  
for (MatchDocumentSummary summary : results.getMatchResults()) {
    System.out.println(doc.read(summary.getUri(), new StringHandle()).toString());
}
但是我得到了以下错误

com.marklogic.client.FailedRequestException: Local message: search failed: Bad Request. Server Message: REST-INVALIDPARAM: (err:FOER0000) Invalid parameter: Invalid query structure (check namespace): <query xmlns:search="http://marklogic.com/appservices/search" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><and-query><term-query><text>hello</text></term-query><value-query><json-key>recipient</json-key><text>world</text></value-query></and-query></query>
at com.marklogic.client.impl.JerseyServices.search(JerseyServices.java:1893)
at com.marklogic.client.impl.JerseyServices.search(JerseyServices.java:1703)
at com.marklogic.client.impl.QueryManagerImpl.search(QueryManagerImpl.java:199)
at com.marklogic.client.impl.QueryManagerImpl.search(QueryManagerImpl.java:162)
com.marklogic.client.FailedRequestException:本地消息:搜索失败:请求错误。服务器消息:REST-INVALIDPARAM:(错误:FOER0000)无效参数:无效查询结构(检查命名空间):hellorecipientworld
位于com.marklogic.client.impl.JerseyServices.search(JerseyServices.java:1893)
位于com.marklogic.client.impl.JerseyServices.search(JerseyServices.java:1703)
位于com.marklogic.client.impl.QueryManagerImpl.search(QueryManagerImpl.java:199)
在com.marklogic.client.impl.QueryManagerImpl.search(QueryManagerImpl.java:162)上
这是什么原因?这是因为某些服务器配置,我需要以某种方式调整代码吗?(我没有管理员权限,并且已经配置了MarkLogic server)

另外,在我在另一台机器上安装了MarkLogic并在那里运行了相同的代码之后,它工作得很好

谢谢, Hlib

更新:

  • 服务器日志不提供任何其他信息
  • 如果我在每个标记中添加“搜索”名称空间,一切都会正常工作

  • 我从类路径中删除了woodstox库。正如@SamMefford所提到的,它导致XMLStreamWriter行为不端。之后一切正常。

    什么版本的MarkLogic 7.0?java客户端api 2.0.5应仅用于MarkLogic Server 7.0-5。值得一提的是,当我使用java客户机api 2.0.5在MarkLogic Server 7.0-5上尝试您的代码时,它对我很有用?你的意思是直接针对REST端点吗?还是使用RawStructuredQueryDefinition?这个错误肯定是XML上缺少一个名称空间,但我不明白StructuredQueryBuilder是如何产生这种错误的,也不明白您是如何通过StructuredQueryBuilder在每个标记中放置名称空间的。您是否尝试过使用最小类路径?我想您的类路径上可能有导致XMLStreamWriter(StructuredQueryBuilder使用)行为不当的东西,并且没有使用默认名称空间@Sam,谢谢。在使用最小类路径运行之后,我发现是woodstox库导致了这个问题