IllegalArgumentException: ProtectionToken не является элементом <wsp: Policy>
Я боролся с проблемой, которая у меня была с Axis2 и Rampart в течение нескольких часов. Я довольно много гуглил и пока не нашел решения. Я даже посмотрел на исходный код и прошел через него с помощью отладчика. Хотя это просветило меня в отношении ошибки и ее причины, это не приблизило меня к решению.
Возникающая ошибка
java.lang.IllegalArgumentException: {http://schemas.xmlsoap.org/ws/2005/07/securitypolicy}ProtectionToken is not a <wsp:Policy> element.
at org.apache.neethi.PolicyBuilder.getPolicyOperator(PolicyBuilder.java:177)
at org.apache.neethi.PolicyBuilder.getPolicy(PolicyBuilder.java:125)
at org.apache.neethi.PolicyEngine.getPolicy(PolicyEngine.java:102)
at org.apache.ws.secpolicy11.builders.SymmetricBindingBuilder.build(SymmetricBindingBuilder.java:41)
at org.apache.ws.secpolicy11.builders.SymmetricBindingBuilder.build(SymmetricBindingBuilder.java:36)
at org.apache.neethi.AssertionBuilderFactoryImpl.invokeBuilder(AssertionBuilderFactoryImpl.java:129)
at org.apache.neethi.AssertionBuilderFactoryImpl.build(AssertionBuilderFactoryImpl.java:110)
at org.apache.neethi.PolicyBuilder.processOperationElement(PolicyBuilder.java:225)
at org.apache.neethi.PolicyBuilder.getAllOperator(PolicyBuilder.java:185)
at org.apache.neethi.PolicyBuilder.processOperationElement(PolicyBuilder.java:218)
at org.apache.neethi.PolicyBuilder.getExactlyOneOperator(PolicyBuilder.java:181)
at org.apache.neethi.PolicyBuilder.processOperationElement(PolicyBuilder.java:216)
at org.apache.neethi.PolicyBuilder.getPolicyOperator(PolicyBuilder.java:175)
at org.apache.neethi.PolicyBuilder.getPolicy(PolicyBuilder.java:114)
at org.apache.neethi.PolicyBuilder.getPolicy(PolicyBuilder.java:100)
at org.apache.neethi.PolicyEngine.getPolicy(PolicyEngine.java:80)
at com.geometryit.blis.ablis.contentManagement.ContentManagementServiceStub.getPolicy(ContentManagementServiceStub.java:413)
at com.geometryit.blis.ablis.contentManagement.ContentManagementServiceStub.populateAxisService(ContentManagementServiceStub.java:57)
at com.geometryit.blis.ablis.contentManagement.ContentManagementServiceStub.<init>(ContentManagementServiceStub.java:108)
at com.geometryit.blis.ablis.contentManagement.ContentManagementServiceStub.<init>(ContentManagementServiceStub.java:97)
at com.geometryit.blis.production.Publish.init(Publish.java:214)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1133)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1087)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:996)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4834)
at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5155)
at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5150)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Хотя я использовал Axis2 и раньше, я не специалист по нему и тем более по Rampart. У меня было существующее веб-приложение, которое было расширено, чтобы представить клиента для взаимодействия с веб-службой. Я установил Axis2 v1.6.1 и Rampart v1.6.1 в соответствии с инструкциями. Я создал клиентские Java-классы, используя скрипт WSDL2Java, и сгруппировал сгенерированные классы в jar. Затем я добавил соответствующие jar-файлы и репозиторий Axis2 в веб-приложение. WSDL и XSD содержатся во вложении wsdl.zip http://mail-archives.apache.org/mod_mbox/axis-java-user/201112.mbox/%3C4B95BC7335A13A42AD0D23462F91AE6F615D057F41%40echo.geometryit.com%3E(% Список рассылки) Приложения находятся внизу страницы.
Раздел кода, который инициализирует клиентскую часть веб-службы,
try
{
ConfigurationContext context = ConfigurationContextFactory.createConfigurationContextFromFileSystem(this.getWebInfPath() + "repository" );
**ablisContentManagementService = new ContentManagementServiceStub( context, "http://services.ablis.uat.business.gov.au/ContentManagement.svc" );
ServiceClient ablisContentManagementServiceClient = ablisContentManagementService._getServiceClient();
ablisContentManagementServiceClient.engageModule( "addressing" );
ablisContentManagementServiceClient.engageModule( "rampart" );
ablisAxisFault = null;
}
catch ( AxisFault af )
{
ablisContentManagementService = null;
ablisAxisFault = af;
af.printStackTrace();
}
catch ( Throwable t )
{
t.printStackTrace();
}
Я знаю, что Rampart не настроен должным образом, но ошибка отображается в выделенной строке (**). Это раньше, где конфигурация Rampart произойдет, если это будет сделано.
При отладке я заметил, что XML, как экземпляр OMElement, передаваемый в SymmetricBindingBuilder.build() (см. Stacktrace), является (сокращен для краткости)
<wsp:Policy>
<sp:ProtectionToken>
.
.
.
</sp:ProtectionToken>
.
.
.
</wsp:Policy>
Из кода в SymmetricBindingBuilder.build () я думаю, что XML должен быть:
<sp:SymmetricBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
<wsp:Policy>
<sp:ProtectionToken>
.
.
.
</sp:ProtectionToken>
.
.
.
</wsp:Policy>
</sp:SymmetricBinding>
Изменение передаваемого XML исправит ошибку, но как это сделать.
Возможно, я сделал ошибки или упущения в том, что я сказал или сделал, чтобы быть кратким. Если важные детали отсутствуют, пожалуйста, выделите их. Я знаком с Axis2, а не с Rampart, поэтому любая помощь приветствуется. Я с удовольствием отвечу на вопросы. Любая помощь с благодарностью.
1 ответ
Я предполагаю, что вы уже прошли эту проблему. Но это свежая, сырая, зудящая рана для меня. После многих часов борьбы почти с той же самой проблемой, я наконец нашел решение.
В сгенерированном клиентском коде, например ClientStub, есть статическая функция getPolicy(), которую необходимо отрегулировать из этого (пробел, отрегулированный для удобства чтения):
private static org.apache.neethi.Policy getPolicy (java.lang.String policyString)
{
java.io.ByteArrayInputStream bais = new java.io.ByteArrayInputStream(policyString.getBytes());
return org.apache.neethi.PolicyEngine.getPolicy(bais);
}
К этому:
private static org.apache.neethi.Policy getPolicy (java.lang.String policyString)
{
java.io.ByteArrayInputStream bais = new java.io.ByteArrayInputStream(policyString.getBytes());
try
{
StAXOMBuilder builder = new StAXOMBuilder(bais);
OMElement documentElement = builder.getDocumentElement();
return org.apache.neethi.PolicyEngine.getPolicy(documentElement);
}
catch (XMLStreamException e)
{
e.printStackTrace();
}
return null;
}
Я наткнулся на это решение в этой почтовой ветке.
, Тофер