使用默认Java 1.6 Java.xml.ws API生成的WSDL中缺少SOAP方法参数
我实现了一个简单的webservice,它有一个方法,该方法接受字符串并返回包含输入参数的消息使用默认Java 1.6 Java.xml.ws API生成的WSDL中缺少SOAP方法参数,java,web-services,soap,wsdl,Java,Web Services,Soap,Wsdl,我实现了一个简单的webservice,它有一个方法,该方法接受字符串并返回包含输入参数的消息 package com.product.mobile.webapp.soap; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import javax.jws.soap.SOAPBinding.Paramete
package com.product.mobile.webapp.soap;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.ParameterStyle;
import javax.jws.soap.SOAPBinding.Style;
import javax.jws.soap.SOAPBinding.Use;
@WebService
@SOAPBinding(style = Style.DOCUMENT, use = Use.LITERAL, parameterStyle = ParameterStyle.WRAPPED)
public class WSHello {
@WebMethod
public String sayMyName(@WebParam(name = "name", mode = Mode.IN) String name) {
return "Hello, ... " + name;
}
}
我将这样发布此端点:
WSHello wsHello = new WSHello();
String wsHelloEndpoint = "http://localhost:8080/hello";
Endpoint.publish(wsHelloEndpoint, wsHello);
启动应用程序时,将创建以下WSDL,并在http://localhost:8080/hello?wsdl
<?xml version="1.0" encoding="UTF-8"?><!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.4-b01. --><!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.4-b01. --><definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://soap.webapp.mobile.product.at/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://soap.webapp.mobile.product.at/" name="WSHelloService">
<types>
<xsd:schema>
<xsd:import namespace="http://soap.webapp.mobile.product.at/" schemaLocation="http://localhost:8080/hello?xsd=1"></xsd:import>
</xsd:schema>
</types>
<message name="sayMyName">
<part name="parameters" element="tns:sayMyName"></part>
</message>
<message name="sayMyNameResponse">
<part name="parameters" element="tns:sayMyNameResponse"></part>
</message>
<portType name="WSHello">
<operation name="sayMyName">
<input wsam:Action="http://soap.webapp.mobile.product.at/WSHello/sayMyNameRequest" message="tns:sayMyName"></input>
<output wsam:Action="http://soap.webapp.mobile.product.at/WSHello/sayMyNameResponse" message="tns:sayMyNameResponse"></output>
</operation>
</portType>
<binding name="WSHelloPortBinding" type="tns:WSHello">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"></soap:binding>
<operation name="sayMyName">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal"></soap:body>
</input>
<output>
<soap:body use="literal"></soap:body>
</output>
</operation>
</binding>
<service name="WSHelloService">
<port name="WSHelloPort" binding="tns:WSHelloPortBinding">
<soap:address location="http://localhost:8080/hello"></soap:address>
</port>
</service>
</definitions>
在客户端,我可以访问我的Web服务,还可以访问方法sayMyName(String name)
我的问题是无法在客户端为函数提供name参数。我假设生成的WSDL是错误的,因为它不包含参数信息
有人能解释一下我在这里做错了什么,为什么WSDL不包含参数参数吗?您所说的参数是在“schemaLocation”属性中指定的。 见下文
<xsd:import namespace="http://soap.webapp.mobile.product.at/" schemaLocation="http://localhost:8080/hello?xsd=1"></xsd:import>
你知道“-keep”的意思是“用源代码生成”
您可以获得一组客户端代码
我有另一个建议
如果您希望将XSD包含到WSDL中,以使“birt”等工具理解WSDL
尝试使用内联模式(不带模式位置)生成WSDL,如下所示
wsgen -cp . com.product.mobile.webapp.soap.WSHello -wsdl -inlineSchemas
将创建“WSHelloService.wsdl”文件
在WSHello类中编辑@WebService注释,如下所示
@WebService(wsdlLocation="WSHelloService.wsdl")
@SOAPBinding(style = Style.DOCUMENT, use = Use.LITERAL, parameterStyle = ParameterStyle.WRAPPED)
public class WSHello {
@WebMethod
public String sayMyName(@WebParam(name = "name", mode = Mode.IN) String name) {
return "Hello, ... " + name;
}
}
重新启动服务器并使用工具访问“”
希望有帮助。您所说的参数是在“schemaLocation”属性中指定的。 见下文
<xsd:import namespace="http://soap.webapp.mobile.product.at/" schemaLocation="http://localhost:8080/hello?xsd=1"></xsd:import>
你知道“-keep”的意思是“用源代码生成”
您可以获得一组客户端代码
我有另一个建议
如果您希望将XSD包含到WSDL中,以使“birt”等工具理解WSDL
尝试使用内联模式(不带模式位置)生成WSDL,如下所示
wsgen -cp . com.product.mobile.webapp.soap.WSHello -wsdl -inlineSchemas
将创建“WSHelloService.wsdl”文件
在WSHello类中编辑@WebService注释,如下所示
@WebService(wsdlLocation="WSHelloService.wsdl")
@SOAPBinding(style = Style.DOCUMENT, use = Use.LITERAL, parameterStyle = ParameterStyle.WRAPPED)
public class WSHello {
@WebMethod
public String sayMyName(@WebParam(name = "name", mode = Mode.IN) String name) {
return "Hello, ... " + name;
}
}
重新启动服务器并使用工具访问“”
希望有帮助。好吧,我终于找到了如何让它工作的方法,基本上我在
@WebService
类中添加了以下注释:
@SOAPBinding(style = SOAPBinding.Style.RPC)
完整示例:
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.ws.BindingType;
@WebService
@BindingType(value = "http://java.sun.com/xml/ns/jaxws/2003/05/soap/bindings/HTTP/")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class WSHello {
@WebMethod
public String sayMyName(@WebParam(name = "name") String name) {
return "Hello, ... " + name;
}
}
好的,我终于找到了如何让它工作,基本上我在我的
@WebService
类中添加了以下注释:
@SOAPBinding(style = SOAPBinding.Style.RPC)
完整示例:
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.ws.BindingType;
@WebService
@BindingType(value = "http://java.sun.com/xml/ns/jaxws/2003/05/soap/bindings/HTTP/")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class WSHello {
@WebMethod
public String sayMyName(@WebParam(name = "name") String name) {
return "Hello, ... " + name;
}
}
我基本上想要的是使用工具BIRT()访问我的web服务。我可以在BIRT客户端中看到我的Web服务和方法,但它不允许我输入任何参数。我已经更新了答案。包含XSD的WSDL可能更适合BIRT。感谢您的建议,您是正确的。我通过使用不同的SOAP绑定实现了这一点,如我在回答中所述。祝你今天愉快!:)我基本上想要的是使用工具BIRT()访问我的web服务。我可以在BIRT客户端中看到我的Web服务和方法,但它不允许我输入任何参数。我已经更新了答案。包含XSD的WSDL可能更适合BIRT。感谢您的建议,您是正确的。我通过使用不同的SOAP绑定实现了这一点,如我在回答中所述。祝你今天愉快!:)