2015-07-01 4 views
0

Я пытаюсь использовать SOAP-сервис, генерируя заглушки с помощью maven cxf-codegen-plugin. Все в порядке с большинством услуг, кроме уродливого. В этом случае при вызове службы отправляет правильный ответ, но мои генерируемые окурки неспособны маршализация это генерировать исключение, как (я заменил URLs с именем, как urlx для краткости):cxf Unmarshalling Error: неожиданный элемент

javax.xml.ws.soap.SOAPFaultException: Unmarshalling Error: unexpected element (uri:"url3", local:"cap"). Expected elements are <{url1}descComune>....<{url1}cap>...

На самом деле Неопределенное поле является частью расширения, которое имеет указанное пространство имен, которое отличается от расширенного элемента. Здесь пространства имен DEF:

<?xml version="1.0" encoding="UTF-8"?> 
    <wsdl:definitions ...xmlns:ns1="url1" ... xmlns:ns3="url3" ... targetNamespace="someUrl"> 
    <wsdl:documentation>WSDatiPersonali</wsdl:documentation> 
    <wsdl:types> 
     <xs:schema xmlns:ax226="url0" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="url0"> 

протяженный хз, как:

<xs:schema xmlns:ax225="url1" xmlns:ax227="url0" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="url1"> 
      <xs:import namespace="url0"/> 
      <xs:complexType name="Indirizzo"> 
       <xs:sequence> 
        <xs:element minOccurs="0" name="cap" nillable="true" type="xs:string"/> 

      </xs:sequence> 
     </xs:complexType> 

и расширяющая один:

<xs:schema xmlns:ax224="url3" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="url3"> 
    <xs:complexType name="Indirizzo"> 
       <xs:complexContent> 
        <xs:extension base="ns1:Indirizzo"> 
         <xs:sequence> 
         ............ 

         </xs:sequence> 
        </xs:extension> 
       </xs:complexContent> 
    </xs:complexType> 
</xs:schema> 

Как вы можете видеть поле "колпачок" находится внутри отец, и когда один сын заполняется службой, cxf не может найти его под пространством имен сына.

У вас есть идеи по установке?

ответ

0

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

  • с помощью аннотаций на классе ответа, как:

    @org.apache.cxf.annotations.EndpointProperty(key = "soap.no.validate.parts", value = "true") 
    
  • настройки свойств для вашего заглушкой службы:

    JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); 
         factory.setServiceClass(YourServiceClass.class);    
         factory.setAddress(this.constants.SOME_URL); 
         Map<String, Object> properties = factory.getProperties(); 
         if(properties==null){ 
          properties= new HashMap<String, Object>(); 
         } 
    
         properties.put("soap.no.validate.parts", "true"); 
         /** 
         * an other option is : 
         * properties.put("set-jaxb-validation-event-handler", "false"); 
         */ 
         factory.setProperties(properties); 
         WSDatiPersonaliPortType port = (WSDatiPersonaliPortType) factory.create(); 
    

Надеюсь, это может быть полезно кому-то другому.

+0

И вы получили элементы? Например, используя это: properties.put ("set-jaxb-validation-event-handler", "false"); У меня есть только нулевые объекты. – ronnyfm

+0

Я отказался от использования JAXB и получил XMLBeans. – ronnyfm

Смежные вопросы