Не удается загрузить модуль Rampart в клиентском проекте Axis2.

Хотя мой проект представляет собой веб-приложение Java, я использую веб-сервисы только в качестве клиента.

Я успешно создал заглушки с помощью Apache Axis2 и протестировал их с помощью SoapUI. Теперь пришло время реализовать безопасность. Это один из сервисов, которые я должен интегрировать. Он отправляет политику WS-Security, поэтому я должен правильно передавать свои учетные данные.

Я хочу интегрировать Apache Rampart в свой проект. Я столкнулся с множеством трудностей при загрузке необходимых файлов JAR и MAR, но я это сделал.

Теперь у меня есть следующая структура проекта:

webapp
   -- WEB-INF
       -- classes
       -- conf
          -- axis2.xml
       -- modules
          -- several -mar files
          -- rampart-1.6.2.mar
          -- modules.list
       -- spring
          -- various context files
       -- web.xml

Я использую Spring для инициализации всех bean-компонентов, включая заглушки веб-сервисов. Если я позволю Spring создавать их экземпляры в обычном режиме, они будут работать так, как ожидалось. Но когда я использую BeanPostProcessor, чтобы задействовать модуль вала, он не работает.

Caused by: org.apache.axis2.AxisFault: Unable to engage module : rampart
at org.apache.axis2.client.ServiceClient.engageModule(ServiceClient.java:363)
at it.csttech.edwin.security.SecurityHandler.engage(SecurityHandler.java:52)

В моем axis2.xml я добавил <module ref="rampart" /> после addressing

Я включаю Rampart с помощью следующего кода:

    RampartConfig rc = new RampartConfig();
    rc.setUser(user);
    Policy policy = PolicyEngine.getPolicy(new StAXOMBuilder(policyStream).getDocumentElement()); //XML policy file in classpath
    policy.addAssertion(rc);
    serviceClient.engageModule("rampart"); //this fails
    Options options = serviceClient.getOptions();
    options.setProperty(WSHandlerConstants.PW_CALLBACK_REF, callbackHandler); //This will provide password
    options.setProperty(RampartMessageData.KEY_RAMPART_POLICY, policy); //This will provide policy

Я обнаружил, что если я сделаю Map<String, AxisModule> modules = serviceClient.getAxisConfiguration().getModules();, я просто получу пустую карту!!!!

Таким образом, никакие модули не загружаются вообще.

Затем я попытался переместить каталог modules/ в другое место на жестком диске и связать его через системное свойство axis2.repo, но даже если Axis2 не загрузится, если я умышленно укажу неверный путь, он просто не загрузит файл rampart-1.6.2.mar и карта будет по-прежнему пустой.

Я схожу с ума. Я не знаю, как правильно загрузить Rampart в мою установку. Я даже не знаю, можно ли использовать Spring IoC для внедрения правильной конфигурации и/или задействования Rampart во всех службах.


person usr-local-ΕΨΗΕΛΩΝ    schedule 12.03.2014    source источник


Ответы (1)


Вы можете попробовать создать ConfigurationContext и использовать его для получения ServiceClient.

// create configuration context
ConfigurationContext ctx = ConfigurationContextFactory.createConfigurationContextFromFileSystem(RESOURCES_DIR, null);

// create service client
ServiceClient serClient = new ServiceClient(ctx, null);

// engage modules
serClient.engageModule("rampart");

Где «RESOURCES_DIR» должен указывать на расположение ваших файлов .mar.

person Ravinderjit    schedule 13.03.2014
comment
Та же ошибка. Я трижды проверил, что System.getProperty(axis2.repo) имеет правильную директорию, то есть C:/path/to/modules/ - person usr-local-ΕΨΗΕΛΩΝ; 13.03.2014
comment
RESOURCES_DIR (axis2.repo) должен указывать на родительский каталог модулей, и этот родительский каталог также должен включать каталог сервисов. Взгляните на axis.apache.org/axis2/java/ core/docs/adv-userguide.html (найдите главу Axis2 Repository, в которой объясняется структура репозитория) - person Artur Łysik; 18.04.2018