Web services 由具有抽象全局元素的WSDL定义的JAX-WS web服务
以下是包含名为paramName的抽象全局元素的WSDL:Web services 由具有抽象全局元素的WSDL定义的JAX-WS web服务,web-services,jaxb,wsdl,jax-ws,jboss7.x,Web Services,Jaxb,Wsdl,Jax Ws,Jboss7.x,以下是包含名为paramName的抽象全局元素的WSDL: <wsdl:definitions name="AdapterSessionManagerService" targetNamespace="http://companyname.org/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:tns="htt
<wsdl:definitions name="AdapterSessionManagerService" targetNamespace="http://companyname.org/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:tns="http://companyname.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<wsdl:types>
<xs:schema elementFormDefault="unqualified" targetNamespace="http://companyname.org/" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<import namespace="http://companyname.org/adapter1/" schemaLocation="http://localhost:8081/adapters/AdapterSessionManager?xsd=adapter1/ElementName.xsd"/>
<import namespace="http://companyname.org/adapter2/" schemaLocation="http://localhost:8081/adapters/AdapterSessionManager?xsd=adapter2/ElementName.xsd"/>
<xs:element name="initAdapterSession" type="tns:initAdapterSession"/>
<xs:element name="initAdapterSessionResponse" type="tns:initAdapterSessionResponse"/>
<xs:complexType name="initAdapterSession">
<xs:sequence>
<xs:element name="adapterId" type="xs:long"/>
<xs:element name="callbackURL" type="xs:anyURI"/>
<xs:element name="adapterInputData" type="tns:AdapterInputDataType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="initAdapterSessionResponse">
<xs:sequence>
<xs:element minOccurs="0" name="return" type="xs:long"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="AdapterInputDataType">
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="atomicParam" type="tns:AtomicParamType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="AtomicParamType">
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="1" ref="tns:paramName"/>
<xs:element maxOccurs="1" minOccurs="1" name="paramValue" type="tns:AtomicParamValueType"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="AtomicParamValueType">
<xs:union memberTypes="xs:string xs:long xs:decimal xs:dateTime xs:boolean"/>
</xs:simpleType>
<xs:element abstract="true" name="paramName" type="xs:string"/>
</xs:schema>
</wsdl:types>
<wsdl:message name="initAdapterSessionResponse">
<wsdl:part element="tns:initAdapterSessionResponse" name="parameters"/>
</wsdl:message>
<wsdl:message name="initAdapterSession">
<wsdl:part element="tns:initAdapterSession" name="parameters"/>
</wsdl:message>
<wsdl:portType name="AdapterSessionManager">
<wsdl:operation name="initAdapterSession">
<wsdl:input message="tns:initAdapterSession" name="initAdapterSession"/>
<wsdl:output message="tns:initAdapterSessionResponse" name="initAdapterSessionResponse"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="AdapterSessionManagerServiceSoapBinding" type="tns:AdapterSessionManager">
<soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="initAdapterSession">
<soap12:operation soapAction="" style="document"/>
<wsdl:input name="initAdapterSession">
<soap12:body use="literal"/>
</wsdl:input>
<wsdl:output name="initAdapterSessionResponse">
<soap12:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="AdapterSessionManagerService">
<wsdl:port binding="tns:AdapterSessionManagerServiceSoapBinding" name="AdapterSessionManagerPort">
<soap12:address location="http://localhost:8081/adapters/AdapterSessionManager"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
此元素将在SOAP消息中用另一个名称空间中定义的相同命名元素替代。以下是此类定义的一个示例:
<schema targetNamespace="http://companyname.org/adapter1/" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:inptypns="http://companyname.org/" xmlns:tns="http://companyname.org/adapter1/">
<import namespace="http://companyname.org/"/>
<element name="paramName" substitutionGroup="inptypns:paramName" type="tns:AtomicParamNameType"/>
<simpleType name="AtomicParamNameType">
<restriction base="string">
<enumeration value="foo"/>
<enumeration value="bar"/>
</restriction>
</simpleType>
</schema>
以下是实现此web服务的Java代码,包括wsimport生成的代码:
@WebService(wsdlLocation = "WEB-INF/wsdl/AdapterSessionManager.wsdl")
@BindingType(SOAPBinding.SOAP12HTTP_BINDING)
public class AdapterSessionManager {
@WebMethod
public Long initAdapterSession(
@WebParam(name = "adapterId")
@XmlElement(required = true)
Long adapterId,
@WebParam(name = "callbackURL")
@XmlElement(required = true)
URL callbackURL,
@WebParam
@XmlElement(required = true)
AdapterInputDataType adapterInputData
) {...}
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "AdapterInputDataType", propOrder = {
"atomicParam"
})
public class AdapterInputDataType {
protected List<AtomicParamType> atomicParam;
public List<AtomicParamType> getAtomicParam() {
if (atomicParam == null) {
atomicParam = new ArrayList<AtomicParamType>();
}
return this.atomicParam;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "AtomicParamType", propOrder = {
"paramName",
"paramValue"
})
public class AtomicParamType {
@XmlElementRef(name = "paramName", namespace = "http://companyname.org/", type = JAXBElement.class)
protected JAXBElement<?> paramName;
@XmlElement(required = true)
protected String paramValue;
public JAXBElement<?> getParamName() {
return paramName;
}
public void setParamName(JAXBElement<?> value) {
this.paramName = value;
}
public String getParamValue() {
return paramValue;
}
public void setParamValue(String value) {
this.paramValue = value;
}
}
@XmlRegistry
public class ObjectFactory {
private final static QName _ParamName_QNAME = new QName("http://companyname.org/", "paramName");
public ObjectFactory() {
}
public AtomicParamType createAtomicParamType() {
return new AtomicParamType();
}
public AdapterInputDataType createAdapterInputDataType() {
return new AdapterInputDataType();
}
@XmlElementDecl(namespace = "http://companyname.org/", name = "paramName")
public JAXBElement<String> createParamName(String value) {
return new JAXBElement<String>(_ParamName_QNAME, String.class, null, value);
}
}
@XmlType(name = "AtomicParamNameType", namespace = "http://companyname.org/adapter1/")
@XmlEnum
public enum AtomicParamNameType {
@XmlEnumValue("foo")
FOO("foo"),
@XmlEnumValue("bar")
BAR("bar");
private final String value;
AtomicParamNameType(String v) {
value = v;
}
public String value() {
return value;
}
public static AtomicParamNameType fromValue(String v) {
for (AtomicParamNameType c: AtomicParamNameType.values()) {
if (c.value.equals(v)) {
return c;
}
}
throw new IllegalArgumentException(v);
}
}
@XmlRegistry
public class ObjectFactory {
private final static QName _ParamName_QNAME = new QName("http://companyname.org/adapter1/", "paramName");
public ObjectFactory() {
}
@XmlElementDecl(namespace = "http://companyname.org/adapter1/", name = "paramName", substitutionHeadNamespace = "http://companyname.org/", substitutionHeadName = "paramName")
public JAXBElement<AtomicParamNameType> createParamName(AtomicParamNameType value) {
return new JAXBElement<AtomicParamNameType>(_ParamName_QNAME, AtomicParamNameType.class, null, value);
}
}
@WebService(wsdlLocation=“WEB-INF/wsdl/AdapterSessionManager.wsdl”)
@BindingType(SOAPBinding.SOAP12HTTP\U绑定)
公共类AdapterSessionManager{
@网络方法
公共长时间会话(
@WebParam(name=“adapterId”)
@XmlElement(必需=true)
长适配器,
@WebParam(name=“callbackURL”)
@XmlElement(必需=true)
URL回调URL,
@网页内存
@XmlElement(必需=true)
AdapterInputDataType adapterInputData
) {...}
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name=“AdapterInputDataType”,比例器={
“原子参数”
})
公共类AdapterInputDataType{
受保护列表”,本地:“参数名”)。应为
要素是,
看起来JAXB不知道http://companyname.org/adapter1/
namespace。但我无法想象JAXB为什么会以这种方式运行。我的错误在哪里?有什么想法吗?您已经知道答案:与不一样
生成的源代码明确指出paramName
元素是在命名空间中定义的,如下所示
@XmlElementRef(name = "paramName", namespace = "http://companyname.org/", type = JAXBElement.class)
protected JAXBElement<?> paramName;
@xmlementref(name=“paramName”,名称空间=”http://companyname.org/,type=JAXBElement.class)
受保护的JAXBElement参数名;
因此,将名称空间
属性更改为http://companyname.org/adapter1
允许JAXB正确解组您的负载
@XmlElementRef(name = "paramName", namespace = "http://companyname.org/", type = JAXBElement.class)
protected JAXBElement<?> paramName;