Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用默认Java 1.6 Java.xml.ws API生成的WSDL中缺少SOAP方法参数_Java_Web Services_Soap_Wsdl - Fatal编程技术网

使用默认Java 1.6 Java.xml.ws API生成的WSDL中缺少SOAP方法参数

使用默认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

我实现了一个简单的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.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绑定实现了这一点,如我在回答中所述。祝你今天愉快!:)