Я относительно новичок в SOAP / веб-сервисах;в то время как я сделал несколько небольших проектов веб-сервисов, мне, кстати, никогда не требовалось возвращать (или использовать в качестве параметра) массив или коллекцию «сложных» объектов.Когда я пытаюсь это сделать, я получаю различное странное поведение в зависимости от стиля привязки SOAP.
Когда я использую RPC / литерал , я могу отправлять и получать массивы встроенных типов (например, String []), но когда я пробую «сложный» объект, я получаю ошибки маршалинга (например, xyz, ни один из его суперкласса не известен этому контексту), несмотря на добавление соответствующих классов в аннотацию @XmlSeeAlso.
В качестве альтернативы, попытка Document / literal / wrapped (что, кажется, является лучшей практикой?) Позволяет мне отправлять или получать сложные объекты, но приводит к некоторым странностям, когда я пытаюсь обойти массивы любыхтип.Например, String[] t = { "A", "B", "C", "D" };
достигает веб-службы в виде пустой String (не String [] ).
Кто-нибудь знает, что здесь происходит иликак заставить вещи работать любым разумным способом?В данный момент я выполняю локальное развертывание в Apache Geronimo.
Фрагмент кода сервера:
Интерфейс:
@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>
Спасибоочень заранее за любую помощь, которую вы можете предоставить!