Hallo,
ich habe einen Web-Service und einen dazugehörigen Clienten geschrieben. Nutze ich Glassfish , so funktioniert die Anbindung reibungslos. Wenn ich den Web-Service aber in axis( auf dem tomcat laufend) deploye, dann kann ich mich zwar verbinden, aber bekomme die Meldung : undefined port type , sobald ich auf die Methode(Operation) des Web-Services zugreife. Mit ist weiter hin ausgefallen, das die beiden generierten wsdl-Files (von Glassfish und axis auf tomcat) sich unterschieden.
wsdl unter tomcat :
[XML]
<wsdl:definitions targetNamespace=“http://webTest”>
wsdl:documentationTest von Web-Services.</wsdl:documentation>
wsdl:types
<xs:schema attributeFormDefault=“qualified” elementFormDefault=“qualified” targetNamespace=“http://webTest”>
<xs:element name=“check”>
xs:complexType
xs:sequence
<xs:element minOccurs=“0” name=“args0” nillable=“true” type=“xs:string”/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name=“checkResponse”>
xs:complexType
xs:sequence
<xs:element minOccurs=“0” name=“return” nillable=“true” type=“xs:string”/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</wsdl:types>
<wsdl:message name=“checkRequest”>
<wsdl:part name=“parameters” element=“ns:check”/>
</wsdl:message>
<wsdl:message name=“checkResponse”>
<wsdl:part name=“parameters” element=“ns:checkResponse”/>
</wsdl:message>
<wsdl:portType name=“WebTestServicePortType”>
<wsdl:operation name=“check”>
<wsdl:input message=“ns:checkRequest” wsaw:Action=“urn:check”/>
<wsdl:output message=“ns:checkResponse” wsaw:Action=“urn:checkResponse”/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name=“WebTestServiceSoap11Binding” type=“ns:WebTestServicePortType”>
<soap:binding transport=“http://schemas.xmlsoap.org/soap/http” style=“document”/>
<wsdl:operation name=“check”>
<soap:operation soapAction=“urn:check” style=“document”/>
wsdl:input
<soap:body use=“literal”/>
</wsdl:input>
wsdl:output
<soap:body use=“literal”/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:binding name=“WebTestServiceSoap12Binding” type=“ns:WebTestServicePortType”>
<soap12:binding transport=“http://schemas.xmlsoap.org/soap/http” style=“document”/>
<wsdl:operation name=“check”><soap12:operation soapAction=“urn:check” style=“document”/>
wsdl:input
<soap12:body use=“literal”/>
</wsdl:input>
wsdl:output
<soap12:body use=“literal”/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:binding name=“WebTestServiceHttpBinding” type=“ns:WebTestServicePortType”>
<http:binding verb=“POST”/>
<wsdl:operation name=“check”>
<http:operation location=“check”/>
wsdl:input
<mime:content type=“application/xml” part=“parameters”/>
</wsdl:input>
wsdl:output
<mime:content type=“application/xml” part=“parameters”/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name=“WebTestService”>
<wsdl:port name=“WebTestServiceHttpSoap11Endpoint” binding=“ns:WebTestServiceSoap11Binding”>
<soap:address location=“http://localhost:8035/axis2/services/WebTestService.WebTestServiceHttpSoap11Endpoint/”/>
</wsdl:port>
<wsdl:port name=“WebTestServiceHttpSoap12Endpoint” binding=“ns:WebTestServiceSoap12Binding”>
<soap12:address location=“http://localhost:8035/axis2/services/WebTestService.WebTestServiceHttpSoap12Endpoint/”/>
</wsdl:port>
<wsdl:port name=“WebTestServiceHttpEndpoint” binding=“ns:WebTestServiceHttpBinding”>
<http:address location=“http://localhost:8035/axis2/services/WebTestService.WebTestServiceHttpEndpoint/”/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
[/XML]
wsdl vom Glassfish generiert, wo auch alles auf anhieb lief:
[XML]
[/XML]Web-Service Interface:
package webTest;
import javax.jws.*;
@WebService
public interface WebTest
{
@WebMethod(operationName="check", action="check")
public String check(String name);
}
Web-Service Klasse
package webTest;
import javax.jws.*;
import javax.ejb.*;
@WebService(endpointInterface="webTest.WebTest", serviceName="WebTest", portName="WebTestPort")
@Stateless
public class DefaultWebTest
implements WebTest
{
public String check(String name)
{
return "test check : " + name;
}
}
services.xml
[XML]
Test von Web-Services.
webTest.WebTest
<!--actionMapping>urn:getLogger</actionMapping-->
</operation>
[/XML]
Client-Application:
import javax.xml.ws.*;
import java.net.*;
import javax.xml.namespace.*;
import webTest.*;
import base.*;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author seann
*/
public class WebTestClient
{
public WebTestClient()
{
}
public static void main(String[] args)
{
WebTestClient webTestClient = new WebTestClient();
webTestClient.test();
}
public void test()
{
try {
//URL url = new URL("http://localhost:8035/axis2/services/WebTestService?wsdl"); //tomcat
URL url = new URL(" http://localhost:8080/WebTest/DefaultWebTest?wsdl"); //glassfish
//String nameSpace = "http://webTest"; //Namespace tomcat
String nameSpace = "http://webTest/"; //Namespace glassfish
String port = "WebTestPort"; //glassfish
//String port = "WebTestServiceHttpEndpoint"; //tomcat
Service service = Service.create(url, new QName(nameSpace, "WebTest"));
//WebTest webTest = service.getPort(webTest.WebTest.class);
WebTest webTest = service.getPort(new QName( nameSpace
, port)
,WebTest.class
);
System.out.println("" + webTest.getClass().getCanonicalName() );
//ObjectSerializerToXML s = new ObjectSerializerToXML();
System.out.println(webTest.check("main"));
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
Bei der Verbindung zum Web-Service auf dem Tomcat kommt es zur einer Exception “undefined port type” in Zeile 47 des Clienten.
Die Angabe portName=“WebTestPort” beim Service wird vom Glassfish umgesetzt, der Tomcat scheint dessen keine Bedeutung zu schenken.
Wie kann ich richtig Taggen, sodass ich eine konsistente Anbindung bekomme, egal auf welchem Server mein Web-Service läuft?
Vielen Dank schon im voraus.
lg JSeann