java - MarkLogic:将 Map-Object 从 Java 传递到 XQuery

标签 java xquery marklogic

我想传递一个简单的Java Map<String, String>通过 MarkLogic Java API 到 XQuery 脚本。该脚本已部署到 /ext服务器上的目录并像这样启动:

xquery version "1.0-ml";

declare variable $dr as xs:string external;
declare variable $en as xs:string external;
declare variable $fi as map:map external;
...

我正在使用 MarkLogic 站点上描述的模式:https://docs.marklogic.com/guide/java/resourceservices#id_70532 (“模块调用的基本步骤”)。

我的 Java 代码如下所示:

Map<String, String> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");

ServerEvaluationCall invoker = client.newServerEval();
invoker.addVariable("dr", "foo");
invoker.addVariable("en", "bar");
invoker.addVariableAs("fi", map);
String response = invoker.evalAs(String.class);

由于以下异常而失败:

java.lang.IllegalArgumentException: No factory for class java.util.HashMap
    at com.marklogic.client.impl.HandleFactoryRegistryImpl.makeHandle(HandleFactoryRegistryImpl.java:98) ~[marklogic-client-api-4.0.3.jar:?]
    at com.marklogic.client.impl.ServerEvaluationCallImpl.addVariableAs(ServerEvaluationCallImpl.java:123) ~[marklogic-client-api-4.0.3.jar:?]

我认为我需要在将 map 发送到 ML 之前对其进行转换,或者可能使用其中一个处理程序类,但我无法解决它或找到任何相关示例。以前有人这样做过吗?

最佳答案

应该可以将 Jackson JSON 对象传递给 XQuery 外部变量。 XQuery 中的值应该是 XQuery 映射或 JSON 节点。如果是 JSON 节点,则 xdmp:from-json()函数可以将值转换为 XQuery 映射。

对于 Java 部分,请查找介绍为“以下代码使用 Jackson 对象映射器将外部变量值设置为 JSON 对象”的示例:

https://docs.marklogic.com/guide/java/resourceservices#id_21827

希望有帮助,

关于java - MarkLogic:将 Map-Object 从 Java 传递到 XQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51932451/

相关文章:

基于同一元素多个属性值的Marklogic查询

javax.naming.NameNotFoundException : ConnectionFactory with Wildfly 9. 0.1.Final

java - PrintWriter 只写部分文本

java - 每次在 Hibernate 中动态创建 EntityManager/连接到自定义主机/DB

xml - XQuery 从 XML 文件中删除属性 onlyChannels ="print"的所有元素

sql-server - 检查 XML 元素是否在 SQL 中标记为 `xsi:nil`

cocoa - 在 Cocoa 的 NSXML XQuery 中从 dateTime 中减去持续时间

xml - XQuery 中基于变量的动态排序(排序依据)

java - 通配符匹配和完全匹配的分数之间存在不匹配

database-replication - MarkLogic 复制中的 XDQP 是什么