Mule-4: статический вызов метода с объектом Map в качестве аргумента в Dataweave 2.0 - PullRequest
0 голосов
/ 20 марта 2019

Я работаю над миграцией с Mule 3.9 на 4.1.4, у меня есть Java-логика, вызываемая в глобальных функциях, определенных скриптом Groovy в global-config.xml в Mule 3.9, и пытаюсь перенести его в Mule 4 с использованием следующего подхода.

Вот один случай использования, когда статический метод java принимает Map в качестве аргумента, в Dataweave 2.0 я не видел ни одного примера, когда Dataweave вызывал бы java-метод, имеющий объект Map.Так как опробованный ниже вариант

Вариант-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 потерял много времени, подумал попробовать вариант-2передача строки JSON методу java, затем преобразование ее в Map и повторное использование существующей логики.Но не повезло, некоторые другие проблемы см. В журналах ошибок для получения более подробной информации.

Пожалуйста, предложите мне, если есть какое-либо решение для этого ???

Опция-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 как часть модуля mule APIKit, я попытался добавить зависимость Gson в список включения в pom, также добавивв 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)
}

1 Ответ

1 голос
/ 20 марта 2019

Для первой части вы можете передать карту этому методу путем приведения к объекту.Исходя из вашего класса, это работает для меня:

%dw 2.0

import java!com::mycompany::JsonUtil

var mymap = {key:"val"}
output application/json
---
{
    result: JsonUtil::getTableAndColumns(mymap as Object)
}

Для части 2: я предполагаю, что нет необходимости, если работает вариант 1.Однако вам нужно добавить зависимость специально для вашего приложения, и не полагаться на транзитивные зависимости.В любом случае это лучшая практика, так как вы не можете ожидать, что APIKit будет всегда использовать gson:

<dependencies>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
        </dependency>
...
</dependencies>
...