2012-11-22 15 views
5

W projekcie Java utworzyłem klienta usługi WWW przy użyciu jax-ws i wsdl. Żądanie jest poprawne xml, ale brakuje prefiksu, który jest potrzebny w tym konkretnym wywołaniu mydła. Obecnie rozwiązuję to ręcznie, dodając xmlns = {@ javax.xml.bind.annotation.XmlNs (prefix = "gen", namespaceURI = "http: // schemas ...")}) do klasy package-info.java ale czuję, że to nie jest najlepsze rozwiązanie, ponieważ informacje o pakiecie są tworzone automatycznie, a moje rozwiązanie zostanie nadpisane, jeśli z jakiegoś powodu źródła zostaną wygenerowane ponownie.Brakujący prefiks w żądaniu mydła przy użyciu jax-ws

Podejrzewam, że czegoś brakuje w moim pliku wsdl.

Oto WSDL:

<?xml version="1.0" encoding="UTF-8"?> 
    <wsdl:definitions xmlns:tns="http://xmlns.example.com/1308658932768" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns0="http://schemas.triennium.com/Servicepunt/gen" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" name="Untitled" targetNamespace="http://xmlns.example.com/1308658932768"> 
     <wsdl:types> 
     <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns="http://schemas.triennium.com/Servicepunt/gen" 
    targetNamespace="http://schemas.triennium.com/Servicepunt/gen" 
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified"> 
      <xs:element name="CallInfo"> 
       <xs:complexType> 
        ... 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="ResponseStatus"> 
       <xs:complexType> 
        ... 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="Credentials"> 
       <xs:complexType> 
        ... 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="AuthenticateAannemerRequest"> 
       <xs:complexType> 
        ... 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="AuthenticateAannemerResponse"> 
       <xs:complexType> 
        ... 
       </xs:complexType> 
      </xs:element> 
     </xs:schema> 
    </wsdl:types> 
    <wsdl:service name="WSDL_Generator.2.0.2"> 
     <wsdl:port name="AuthenticateAannemer.2.0.2" binding="tns:AuthenticateAannemer.2.0.2Binding"> 
      <soap:address location="http://10.11.2.12:2592"/> 
     </wsdl:port> 
    </wsdl:service> 
    <wsdl:portType name="AuthenticateAannemer"> 
     <wsdl:operation name="AuthenticateAannemer"> 
      <wsdl:input message="tns:AuthenticateAannemerRequest"/> 
      <wsdl:output message="tns:AuthenticateAannemerResponse"/> 
     </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="AuthenticateAannemer.2.0.2Binding" type="tns:AuthenticateAannemer"> 
     <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 
     <wsdl:operation name="AuthenticateAannemer"> 
      <soap:operation style="document" soapAction="/AuthenticateAannemer.2.0.2/AuthenticateAannemer"/> 
      <wsdl:input> 
       <soap:body use="literal" parts="input"/> 
      </wsdl:input> 
      <wsdl:output> 
       <soap:body use="literal" parts="output"/> 
      </wsdl:output> 
     </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:message name="AuthenticateAannemerRequest"> 
     <wsdl:part name="input" element="ns0:AuthenticateAannemerRequest"/> 
    </wsdl:message> 
    <wsdl:message name="AuthenticateAannemerResponse"> 
     <wsdl:part name="output" element="ns0:AuthenticateAannemerResponse"/> 
    </wsdl:message> 
</wsdl:definitions> 

Oto wniosek bez przedrostka:

<?xml version='1.0' encoding='UTF-8'?> 
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
     <AuthenticateAannemerRequest xmlns="http://schemas.triennium.com/Servicepunt/gen"> 
      <CallInfo> 
       <Customer>...</Customer> 
       <Module>...</Module> 
       <Version>...</Version> 
      </CallInfo> 
      <Credentials> 
       <Username>...</Username> 
       <Password>...</Password> 
      </Credentials> 
     </AuthenticateAannemerRequest> 
    </S:Body> 
</S:Envelope> 

Oto wniosek, że ma to być:

<?xml version='1.0' encoding='UTF-8'?> 
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
     <gen:AuthenticateAannemerRequest xmlns:gen="http://schemas.triennium.com/Servicepunt/gen"> 
      <gen:CallInfo> 
       <gen:Customer>...</Customer> 
       <gen:Module>...</Module> 
       <gen:Version>...</Version> 
      </gen:CallInfo> 
      <gen:Credentials> 
       <gen:Username>...</Username> 
       <gen:Password>...</Password> 
      </gen:Credentials> 
     </gen:AuthenticateAannemerRequest> 
    </S:Body> 
</S:Envelope> 

edit: dodano przedrostek do nazwypacedeclaration w drugim przykładzie, który był na początku, ale został zagubiony jakoś podczas c/p kodu .

+5

Dla parsera XML lub implementacji mydła oba żądania powinny być identyczne. Przedrostek nie ma znaczenia w XML, ważne są przestrzeń nazw i lokalna część nazwy. W twoim drugim przykładzie prefiks 'gen' nie jest w rzeczywistości związany z żadną przestrzenią nazw, która powinna być nieważna. Jeśli zamierzałeś użyć 'xmlns: gen'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' –

Odpowiedz

0
@XmlRootElement(namespace = "http://schemas.triennium.com/Servicepunt/gen") 
public class AuthenticateAannemerRequest implements Serializable { 

    private CallInfo callInfo; 
    private Credentials credentials; 

    public AuthenticateAannemerRequest() { 
    } 

    @XmlElement(namespace = "http://schemas.triennium.com/Servicepunt/gen") 
    public CallInfo getCallInfo() { 
     return callInfo; 
    } 

    public void setCallInfo(CallInfo callInfo) { 
     this.callInfo = callInfo; 
    } 

    @XmlElement(namespace = "http://schemas.triennium.com/Servicepunt/gen") 
    public Credentials getCredentials() { 
     return credentials; 
    } 

    public void setCredentials(Credentials credentials) { 
     this.credentials = credentials; 
    } 
} 
0

Będziesz musiał ręcznie skompilować pakiet-info.java do pliku klasy.

0

Jeśli generujesz klasy ze schematu, możesz dodać plik powiązań JAXB.

Zobacz ten answer dla szablonu tego pliku, który określa prefiks dla domyślnej przestrzeni nazw schematu.

Następnie określ dodatkowy plik powiązań podczas korzystania z narzędzia do generowania.

EDIT

Przykładem plik należy użyć byłoby:

<?xml version="1.0"?> 
<jxb:bindings version="1.0" 
       xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:namespace="http://jaxb2-commons.dev.java.net/namespace-prefix" 
       xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd 
       http://jaxb2-commons.dev.java.net/namespace-prefix http://java.net/projects/jaxb2-commons/sources/svn/content/namespace-prefix/trunk/src/main/resources/prefix-namespace-schema.xsd"> 

    <jxb:bindings> 
     <jxb:schemaBindings> 
      <jxb:package name="your-package-name-here" /> 
     </jxb:schemaBindings> 
     <jxb:bindings> 
      <namespace:prefix name="http://schemas.triennium.com/Servicepunt/gen" /> 
     </jxb:bindings> 
    </jxb:bindings> 
</jxb:bindings> 

Pamiętaj przy generowaniu klas użyć wtyczki jaxb-commons.