У меня есть верблюжий маршрут, который довольно прост, за исключением использованного xquery, поэтому я извлек его в отдельный файл. На моем верблюжьем маршруте я вызываю xquery с помощью Transformer EIP:
.transform().xquery("resource:classpath:xquery/myCoolXQuery.xquery",String.class)
Сам XQuery работает нормально, но из-за некоторых функциональных изменений я хочу импортировать другой модуль XQuery, который я хочу использовать в качестве «библиотеки» с некоторыми вспомогательными функциями, потому что у меня есть много XQuery-файлов, которые могут их использовать .
Итак, что я сделал в своем XQuery:
xquery version "3.0" encoding "UTF-8";
declare namespace fn = 'http://www.w3.org/2005/xpath-functions';
(: Library of really helpful functions :)
import module namespace lib = "http://handofnod.com/xquery-lib" at "classpath:xquery/lib.xquery";
Вопрос:
Как настроить Apache Camel, чтобы StandardModuleURIResolver
мог загружать импортированный модуль из classpath ?
Пока что исследования / проблема
К сожалению, верблюд apache теперь бросает NullpointerException
в StandardModuleURIResolver
в:
if ("classpath".equals(absoluteURI.getScheme())) {
String path = absoluteURI.getPath();
is = this.config.getDynamicLoader().getResourceAsStream(path);
Это потому, что absoluteURI
(то есть "classpath:xquery/lib.xquery"
) не может быть конвертировано правильно, а переменная path
равна NULL
(это в значительной степени запах кода, но сейчас это не мое дело).
absoluteURI
невозможно преобразовать, поскольку net.sf.saxon.query.XQueryParser
не имеет значения, установленного в this.env.getStaticBaseURI()
.
Итак, я попытался во время отладки установить значение staticBaseURI
равным classpath
, но затем StandardModuleURIResolver
также возвращает absoluteURI
, значение которого NULL
в getPath()
, что приводит к тому же NullPointerException
.
Так что теперь я понятия не имею, как использовать Transformer-EIP с XQuery, который использует модуль импорта для некоторых вспомогательных функций.
Другое возможное решение
Другим возможным решением было бы не использовать Transformer-EIP, реализованный в Apache Camel, а вместо этого использовать ToDefinition
, поскольку там можно определить пользовательскую Saxon Configuration поверх параметра URL, который может использовать перезаписанный ModuleURIResolver
, который не имеет проблемы.
Также, конечно, я мог бы использовать пользовательскую реализацию Processor
для достижения того, чего я хочу, но не в этом смысл использовать Camel, который обеспечивает реализацию для EIP.
Было бы замечательно, если бы я мог использовать Transformer-EIP с импортом модулей в моем XQuery.
Настройка проекта:
- Spring-Boot 2.1.0.RELEASE
- Apache Camel 2.22.2
- Сборка с Maven
Последний вопрос
Может кто-нибудь помочь мне, пожалуйста?
Редактировать 1:
Я скачал исходники от Camel и Saxon, чтобы иметь возможность отладки с большим пониманием того, что происходит, и попробовал некоторые вещи:
Сначала я попытался использовать абсолютный путь:
.transform().xquery("resource:classpath:/xquery/myCoolXQuery.xquery",String.class)
Таким образом, я больше не получаю NullPointerException
, потому что в StandardModuleURIResolver
в getQuerySource
путь больше не NULL
:
К сожалению, файл не может быть загружен
config.getDynamicLoader().getResourceAsStream(path);
и возвращает NULL
.
Так что я решил переместить файлы xquery из каталога прямо под src\main\resoures
, но это тоже не помогло, и у меня был тот же результат.