IllegalArgumentException: ProtectionToken не являетсяэлемент - PullRequest
1 голос
/ 03 декабря 2011

В течение нескольких часов я боролся с проблемой, связанной с 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 /% 3C4B95BC7335A13A42AD0D23462F91AE6F615D057F41ry 40it.com.ge 3E * 0* (Axis2 User Mailing List) Прикрепления находятся внизу страницы.

Раздел кода, который инициализирует клиентскую часть веб-службы:

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 Ответ

2 голосов
/ 09 февраля 2012

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

В сгенерированном клиентском коде, например 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;
}

Я столкнулся с этим решением в этой почтовой ветке .

. Тофер

...