gpt4 book ai didi

java - 如何使用 Java 中的 Web 服务(例如 Axis2)发送复杂对象的数组或集合?

转载 作者:行者123 更新时间:2023-11-29 09:22:39 25 4
gpt4 key购买 nike

我对 SOAP/网络服务还比较陌生;虽然我已经完成了一些较小的 Web 服务项目,但顺便说一句,我从来不需要返回(或用作参数)数组或“复杂”对象的集合。当我尝试这样做时,根据我的 SOAP 绑定(bind)样式,我会得到不同的奇怪行为。

当我使用 RPC/literal 时,我可以发送和接收内置类型的数组(例如 String[]),但是当我尝试“复杂”对象时,我会遇到编码错误(例如,xyz 及其任何父类(super class)在此上下文中都是已知的),尽管已将相关类添加到 @XmlSeeAlso 注释中。

或者,尝试使用 Document/literal/wrapped(这似乎是最佳实践?)允许我发送或接收复杂的对象,但是当我尝试传递任何数组时会导致一些奇怪的情况类型。例如,String[] t = { "A", "B", "C", "D"}; 作为一个空的 String (不是 String[])。

有没有人知道这里发生了什么或者如何让事情以任何合理的方式工作?我目前正在本地部署到 Apache Geronimo。

服务器代码片段:

接口(interface):

@WebService
@SOAPBinding(style=Style.DOCUMENT, use=Use.LITERAL, parameterStyle=ParameterStyle.WRAPPED)
@XmlSeeAlso({Feedback.class,Feedback[].class})
public interface CerberusRequest {

...

@WebMethod
public Feedback[] test(String[] facts) throws Exception;

}

实现:

@WebService(serviceName = "CerberusRequestService", portName
= "CerberusRequestPort", targetNamespace = "http://web.cerberus.xyz.gov/",
endpointInterface = "gov.xyz.cerberus.web.CerberusRequest")
public class CerberusRequestImpl implements CerberusRequest {
...
public Feedback[] test(String[] facts) throws Exception {
//Just some debug crap (prints: "in test...1 [Ljava.lang.String;")
System.out.println("in test..." + facts.length + " " + facts.getClass().getName());
for(String f : facts) {
System.out.println("test:" + f);
}
//return feedback;
Feedback[] f = { new Feedback() };
return f;
}
}

客户端代码片段:

URL url = new URL(destination+"?wsdl");
QName qname = new QName(namespace, service);

Service service = Service.create(url, qname);
CerberusRequest sr = service.getPort(CerberusRequest.class);

String[] t = { "A", "B", "C", "D" };
Feedback[] feedback = sr.test(t);
for(Feedback f : feedback) {
System.out.println(f);
}

WSDL:

<?xml version="1.0" encoding="utf-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://web.cerberus.xyz.gov/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="CerberusRequestService" targetNamespace="http://web.cerberus.xyz.gov/">
<types>
<xsd:schema>
<xsd:import namespace="http://web.cerberus.xyz.gov/" schemaLocation="http://localhost:8080/CerberusService/CerberusRequest?xsd=xsd1"/>
</xsd:schema>
<xsd:schema>
<xsd:import namespace="http://jaxb.dev.java.net/array" schemaLocation="http://localhost:8080/CerberusService/CerberusRequest?xsd=xsd2"/>
</xsd:schema>
</types>

<message name="Exception">
<part element="tns:Exception" name="fault">
</part>
</message>
<message name="test">
<part element="tns:test" name="parameters">
</part>
</message>
<message name="testResponse">

<part element="tns:testResponse" name="parameters">
</part>
</message>
<portType name="CerberusRequest">
<operation name="test">
<input message="tns:test">
</input>
<output message="tns:testResponse">
</output>

<fault message="tns:Exception" name="Exception">
</fault>
</operation>
</portType>
<binding name="CerberusRequestPortBinding" type="tns:CerberusRequest">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="test">
<soap:operation soapAction=""/>
<input>

<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
<fault name="Exception">
<soap:fault name="Exception" use="literal"/>
</fault>
</operation>

</binding>
<service name="CerberusRequestService">
<port binding="tns:CerberusRequestPortBinding" name="CerberusRequestPort">
<soap:address location="http://localhost:8080/CerberusService/CerberusRequest"/>
</port>
</service>
</definitions>

非常感谢您提供的所有帮助!

最佳答案

好吧,我有类似的问题,我想传递 VO ,它内部有一个复杂的对象( map ),这个 map 可以包含 map 的 map 作为值或 map 列表。

即使您支持当前要求,您以后也可能会遇到其他问题。更好的是你可以使用第三方序列化器,比如 Castor/Dozer/GSon 之类的工具。并将数据更改为可以轻松通过网络传递的简单 Java 类型。

关于java - 如何使用 Java 中的 Web 服务(例如 Axis2)发送复杂对象的数组或集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5313545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com