Mule-4:在 Dataweave 2.0 中以 Map 对象作为参数的静态方法调用
Mule-4: static method call with Map object as argument in Dataweave 2.0
我正在进行从 Mule 3.9 到 4.1.4 的迁移工作,我在 Mule 3.9 中的 Groovy 脚本定义的全局函数中调用了 java 逻辑,config.xml,尝试使用以下方法将其迁移到 Mule 4 中。
这是一个用例,其中 java 静态方法将 Map 作为参数,在 Dataweave 2.0 中,我没有看到 Dataweave 调用具有 Map 对象的 java 方法的任何示例。由于尝试了以下选项
选项-1:现有代码
class JsonUtil {
public static List<Map<String, String>> getTableAndColumns(Map<String, Object> inputJsonMap) {
List<Map<String, String>> list = null;
//Lot of big logic that to get list out of input Map object
return list;
}
}
在尝试选项 1 浪费了很多时间之后,想到通过将 JSON 字符串传递给 java 方法然后将其转换为 Map,然后重用现有逻辑来尝试选项 2。但运气不好,其他一些问题请参阅错误日志以获取更多详细信息。
请问有什么解决方法吗???
选项-2:现有代码
class JsonUtil {
public static List<Map<String, String>> getTableAndColumns(String inputJsonStr) {
//Using my own utility class to convert JSON string to Map
Map<String, Object> inputJsonMap = MyUtil.toMap(inputJsonStr, Map.class)
List<Map<String, String>> list = null;
//Lot of big logic that to get list out of input Map object
return list;
}
}
但是这里也有一些挑战,我有 Gson 库作为 APIKit mule 模块的一部分,我试图在 pom 的包含列表中添加 Gson 依赖项,还添加了 sharedLibrary,仍然没有运气:(
错误日志:
An exception occurred while trying to execute function `com.mycompany.JsonUtil.getTableAndColumns(java.lang.String)`.
Caused by: java.lang.NoClassDefFoundError: com/google/gson/Gson
Unknown location
Trace:
at invoke (line: -1, column: -1)
at getTableAndColumns (line: -1, column: -1)
at main (line: 9, column: 16)" evaluating expression: "%dw 2.0
import java!com::mycompany::util::JsonUtil
output application/json
---
{
table_column: StringUtil::getTableAndColumns(vars.inputJson)
}
对于第一部分,您可以通过强制对象将地图传递给该方法。根据您的 class,这对我有用:
%dw 2.0
import java!com::mycompany::JsonUtil
var mymap = {key:"val"}
output application/json
---
{
result: JsonUtil::getTableAndColumns(mymap as Object)
}
对于第 2 部分:我猜如果选项 1 可行则不需要。但是,您需要专门为您的应用程序添加依赖项 pom 就可以了,不要依赖传递依赖项。无论如何,这是最佳实践,因为您不能期望 APIKit 始终使用 gson:
<dependencies>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
...
</dependencies>
我正在进行从 Mule 3.9 到 4.1.4 的迁移工作,我在 Mule 3.9 中的 Groovy 脚本定义的全局函数中调用了 java 逻辑,config.xml,尝试使用以下方法将其迁移到 Mule 4 中。
这是一个用例,其中 java 静态方法将 Map 作为参数,在 Dataweave 2.0 中,我没有看到 Dataweave 调用具有 Map 对象的 java 方法的任何示例。由于尝试了以下选项
选项-1:现有代码
class JsonUtil {
public static List<Map<String, String>> getTableAndColumns(Map<String, Object> inputJsonMap) {
List<Map<String, String>> list = null;
//Lot of big logic that to get list out of input Map object
return list;
}
}
在尝试选项 1 浪费了很多时间之后,想到通过将 JSON 字符串传递给 java 方法然后将其转换为 Map,然后重用现有逻辑来尝试选项 2。但运气不好,其他一些问题请参阅错误日志以获取更多详细信息。
请问有什么解决方法吗???
选项-2:现有代码
class JsonUtil {
public static List<Map<String, String>> getTableAndColumns(String inputJsonStr) {
//Using my own utility class to convert JSON string to Map
Map<String, Object> inputJsonMap = MyUtil.toMap(inputJsonStr, Map.class)
List<Map<String, String>> list = null;
//Lot of big logic that to get list out of input Map object
return list;
}
}
但是这里也有一些挑战,我有 Gson 库作为 APIKit mule 模块的一部分,我试图在 pom 的包含列表中添加 Gson 依赖项,还添加了 sharedLibrary,仍然没有运气:(
错误日志:
An exception occurred while trying to execute function `com.mycompany.JsonUtil.getTableAndColumns(java.lang.String)`.
Caused by: java.lang.NoClassDefFoundError: com/google/gson/Gson
Unknown location
Trace:
at invoke (line: -1, column: -1)
at getTableAndColumns (line: -1, column: -1)
at main (line: 9, column: 16)" evaluating expression: "%dw 2.0
import java!com::mycompany::util::JsonUtil
output application/json
---
{
table_column: StringUtil::getTableAndColumns(vars.inputJson)
}
对于第一部分,您可以通过强制对象将地图传递给该方法。根据您的 class,这对我有用:
%dw 2.0
import java!com::mycompany::JsonUtil
var mymap = {key:"val"}
output application/json
---
{
result: JsonUtil::getTableAndColumns(mymap as Object)
}
对于第 2 部分:我猜如果选项 1 可行则不需要。但是,您需要专门为您的应用程序添加依赖项 pom 就可以了,不要依赖传递依赖项。无论如何,这是最佳实践,因为您不能期望 APIKit 始终使用 gson:
<dependencies>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
...
</dependencies>