我正在尝试处理来自Web服务的soap响应。我使用wsimport工具生成用于处理soap响应的客户端类。下面是示例soap响应和java处理程序。
肥皂反应:
<?xml version="1.0" encoding="UTF-8"?>
<DataSet xmlns="http://tempuri.org/">
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="NTIS">
<xs:complexType>
<xs:sequence>
<xs:element name="Error" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
<NewDataSet xmlns="">
<NTIS diffgr:id="NTIS1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
<Error>UserName and/or Password are invalid.</Error>
</NTIS>
</NewDataSet>
</diffgr:diffgram>
</DataSet>
Java处理程序类
package org.tempuri;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import org.w3._2001.xmlschema.Schema;
/**
* <p>Java class for anonymous complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="GetQueryNewResult" minOccurs="0">
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element ref="{http://www.w3.org/2001/XMLSchema}schema"/>
* <any/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </element>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"getQueryNewResult"
})
@XmlRootElement(name = "GetQueryNewResponse")
public class GetQueryNewResponse {
@XmlElement(name = "GetQueryNewResult")
protected GetQueryNewResponse.GetQueryNewResult getQueryNewResult;
/**
* Gets the value of the getQueryNewResult property.
*
* @return
* possible object is
* {@link GetQueryNewResponse.GetQueryNewResult }
*
*/
public GetQueryNewResponse.GetQueryNewResult getGetQueryNewResult() {
return getQueryNewResult;
}
/**
* Sets the value of the getQueryNewResult property.
*
* @param value
* allowed object is
* {@link GetQueryNewResponse.GetQueryNewResult }
*
*/
public void setGetQueryNewResult(GetQueryNewResponse.GetQueryNewResult value) {
this.getQueryNewResult = value;
}
/**
* <p>Java class for anonymous complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element ref="{http://www.w3.org/2001/XMLSchema}schema"/>
* <any/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"schema",
"any"
})
public static class GetQueryNewResult {
@XmlElement(namespace = "http://www.w3.org/2001/XMLSchema", required = true)
protected Schema schema;
@XmlAnyElement(lax = true)
protected Object any;
/**
* Gets the value of the schema property.
*
* @return
* possible object is
* {@link Schema }
*
*/
public Schema getSchema() {
return schema;
}
/**
* Sets the value of the schema property.
*
* @param value
* allowed object is
* {@link Schema }
*
*/
public void setSchema(Schema value) {
this.schema = value;
}
/**
* Gets the value of the any property.
*
* @return
* possible object is
* {@link Object }
*
*/
public Object getAny() {
return any;
}
/**
* Sets the value of the any property.
*
* @param value
* allowed object is
* {@link Object }
*
*/
public void setAny(Object value) {
this.any = value;
}
}
}
客户计划:
package org.ritwik.client;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.soap.Node;
import org.tempuri.BACOnlineResponse;
import org.tempuri.BACOnlineResponse.BACOnlineResult;
import org.tempuri.BASCOnlineResponse;
import org.tempuri.BASCOnlineResponse.BASCOnlineResult;
import org.tempuri.DEAAppSearch;
import org.tempuri.DEAAppSearchResponse;
import org.tempuri.DEAAppSearchResponse.DEAAppSearchResult;
import org.tempuri.Deawebsvc;
import org.tempuri.DeawebsvcSoap;
import org.tempuri.GetIssueDate;
import org.tempuri.GetIssueDateResponse;
import org.tempuri.GetQueryResponse;
import org.tempuri.GetUserInfoResponse;
import org.tempuri.GetUserInfoResponse.GetUserInfoResult;
import org.tempuri.IsUserValidResponse;
import org.tempuri.ObjectFactory;
import org.w3c.dom.Element;
public class WsClient {
/**
* @param args
* @throws JAXBException
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Deawebsvc deaw=new Deawebsvc();
DeawebsvcSoap impl=deaw.getDeawebsvcSoap();
ObjectFactory of=new ObjectFactory();
DEAAppSearchResponse dsSearch=of.createDEAAppSearchResponse();
dsSearch.setDEAAppSearchResult(impl.deaAppSearch("deatest@ritwik.com"," deavalidation", "dea", "bac", "basc", "expirationFrom", "expirationTo", "company", "zip", "state", "pi", "maxRows"));
System.out.println(dsSearch.getDEAAppSearchResult().toString());
System.out.println(dsSearch.getDEAAppSearchResult().getAny());
}
}
现在问题是我无法处理来自&#34; getDEAAppSearchResult()。getAny()&#34;的结果conet。请建议如何处理内容或解组。
org.tempuri.DEAAppSearchResponse$DEAAppSearchResult@7bc768 [diffgr:diffgram:null]
答案 0 :(得分:1)
我遇到了类似的问题,我使用Unmarshaller将详细节点解组为有意义的对象。在我的问题中,生成了详细的类(在您的示例中为NewDataSet)。以下内容可能对您有用:
JAXBContext jaxbContext = JAXBContext.newInstance(NewDataSet.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Node node = (Node) dsSearch.getDEAAppSearchResult().getAny();
NewDataSet dataset = (NewDataSet)unmarshaller.unmarshal(node.getFirstChild());