我目前正在从普通的xml转换许多Web服务。我已经在soapUI中加载它们,创建了一个客户端端口和模拟服务,请求响应工作正常。所以现在我正在尝试创建/转换xml复杂类型对象到java,但我失败了。
在soapUI中,我将此作为回复:
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cli="http://client.serviceweb.xxx">
<soapenv:Header/>
<soapenv:Body>
<cli:versionResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<result xsi:type="java:ResultatVersion" xmlns:java="java:xxx.serviceweb">
<messagexxx xsi:type="xsd:string">message</messagexxx>
<resultatxxx xsi:type="xsd:int">1</resultatxxx>
<version xsi:type="java:Version">
<numero xsi:type="xsd:string">1.0.0</numero>
</version>
</result>
</cli:versionResponse>
</soapenv:Body>
</soapenv:Envelope>
知道如何将其转换为java对象吗?查看原始xml,有一个包含字段消息和结果的父对象,但我不了解版本部分。
这个怎么样?
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xxx="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cli="http://client.serviceweb.xxx">
<soapenv:Header/>
<soapenv:Body>
<cli:testResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<result xsi:type="java:ResultatImage" xmlns:java="java:xxx.serviceweb.xxx.xxx">
<messagexxx xsi:type="xxx:string">message</messagexxx>
<resultatxxx xsi:type="xxx:int">result</resultatxxx>
<image xsi:type="xxx:base64Binary">cid:1325182441595</image>
</result>
</cli:testResponse>
</soapenv:Body>
</soapenv:Envelope>
我已经有一个以前使用过的Jaxb客户端并且已经在运行,但是无法弄清楚如何调用上面的示例。
我有:
javax.xml.bind.UnmarshalException: unexpected element (uri:"http://schemas.xmlsoap.org/soap/envelope/", local:"Envelope"). Expected elements are <{}resultatImage>
似乎响应没有映射到我创建的ResultatImage类。
有什么想法吗?
我如何发送请求并取消响应。
try {
JAXBContext jc = JAXBContext
.newInstance("com.ipiel.response");
Unmarshaller u = jc.createUnmarshaller();
client = new MyClient(httpClient, targetHost, u);
client.test();
} catch (Exception e) {
e.printStackTrace();
}
public void test() {
String url = "/xxxClientsPort/test";
HttpPost httpPost = new HttpPost(url);
HttpResponse response = httpClient.execute(targetHost, httpPost);
log.info("response: " + response);
if (response.getStatusLine().getStatusCode() == 200) {
HttpEntity respEntity = response.getEntity();
if (respEntity != null) {
InputStream instream = respEntity.getContent();
try {
ResultatImage responseEntity = (ResultatImage) unmarshaller
.unmarshal(instream);
/*
* FileWriter writer = new FileWriter(new
* File("c:\\tmp\\output")); IOUtils.copy(instream, writer,
* "UTF-8"); String theString = writer.toString();
* writer.flush(); writer.close();
* System.out.println(theString);
*/
} finally {
instream.close();
}
}
}
}
package com.ipiel.response有Resultat和ResultatImage类,都标记为@XmlRootElement。它还包含标记为@XmlRegistry
的ObjectFactory谢谢,
czetsuya
答案 0 :(得分:0)
使用WSDL将Web服务加载到SOAP UI。 Wsdl包含该类的模式 要将WSDL转换为Java类,可以使用Eclipse插件 wsdl2java plugin
或者你可以使用maven插件,比如
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-wsdl2code-maven-plugin</artifactId>
和
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
答案 1 :(得分:0)
这里的主要问题是我使用错误版本的Axis在SoapUI中生成java类。我正在尝试使用Axis2,但后来发现web服务实际上是在Axis1上运行的。因此,如果您遇到类似问题,请先检查Web服务版本和客户端库是否相同。