我是 Java Web 服务的新手,在过去的 4 天里我一直被这个问题困扰。问题来了,我打算创建 Web 服务以供其他应用程序使用。要求是 Web 服务必须从表中返回多条记录,所以我创建了一个示例 Web 服务,这是代码
界面
@WebService
@SOAPBinding(style = Style.DOCUMENT)
public interface TestClassInt {
/**
* @param args
*/
@WebMethod
SampleClass[] getCaseId (String country);
}
具有两个字符串对象的自定义类
public class SampleClass {
protected String caseid;
protected String dummy;
public SampleClass(){
super();
}
public SampleClass(String caseid,String dummy){
this.caseid=caseid;
this.dummy=dummy;
}
public String getDummy() {
return dummy;
}
public void setDummy(String dummy) {
this.dummy = dummy;
}
public String getCaseid() {
return caseid;
}
public void setCaseid(String caseid) {
this.caseid = caseid;
}
}
这是实现
@WebService(endpointInterface = "com.org.ccb.test.TestClassInt")
public class TestClassImpl implements TestClassInt {
public SampleClass[] getCaseId(String country) {
// TODO Auto-generated method stub
System.out.println("Console " + country);
SampleClass tempSc[] = new SampleClass[2];
tempSc[0]=new SampleClass();
tempSc[1]=new SampleClass();
tempSc[0].setCaseid(country);
tempSc[0].setDummy(country);
tempSc[1].setCaseid(country);
tempSc[1].setDummy(country);
return tempSc;
}
}
使用 JBoss Developer Studio 生成的 WSDL 是
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="TestClassImplService targetNamespace="http://test.ccb.org.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://test.ccb.org.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://test.ccb.org.com/" targetNamespace="http://test.ccb.org.com/" version="1.0">
<xs:element name="getCaseId" type="tns:getCaseId"/>
<xs:element name="getCaseIdResponse" type="tns:getCaseIdResponse"/>
<xs:complexType name="getCaseId">
<xs:sequence>
<xs:element minOccurs="0" name="arg0" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="getCaseIdResponse">
<xs:sequence>
<xs:element maxOccurs="unbounded" name="sampleClass" type="tns:sampleClass"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="sampleClass">
<xs:sequence>
<xs:element maxOccurs="1" name="caseid" type="xs:string"/>
<xs:element maxOccurs="1" name="dummy" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
</wsdl:types>
<wsdl:message name="getCaseIdResponse">
<wsdl:part name="parameters" element="tns:getCaseIdResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getCaseId">
<wsdl:part name="parameters" element="tns:getCaseId">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="TestClassInt">
<wsdl:operation name="getCaseId">
<wsdl:input name="getCaseId" message="tns:getCaseId">
</wsdl:input>
<wsdl:output name="getCaseIdResponse" message="tns:getCaseIdResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="TestClassImplServiceSoapBinding" type="tns:TestClassInt">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getCaseId">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="getCaseId">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getCaseIdResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="TestClassImplService">
<wsdl:port name="TestClassImplPort" binding="tns:TestClassImplServiceSoapBinding">
<soap:address location="http://localhost:8080/rc_ccb/TestClass"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
当给定一个 SOAP 请求时,我得到了强制转换异常 [Lcom.org.ccb.test.SampleClass; 不能转换为 com.org.ccb.test.SampleClass
对于从 Web 服务获取对象数组,以下是 WSDL 定义对吗?
<xs:complexType name="getCaseIdResponse">
<xs:sequence>
<xs:element maxOccurs="unbounded" name="sampleClass" type="tns:sampleClass"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="sampleClass">
<xs:sequence>
<xs:element maxOccurs="1" name="caseid" type="xs:string"/>
<xs:element maxOccurs="1" name="dummy" type="xs:string"/>
</xs:sequence>
</xs:complexType>
服务器:JBoss eap 5.1
任何的想法?
堆栈跟踪
14:31:46,743 WARNING [PhaseInterceptorChain] Interceptor for {http://test.ccb.org.com /}TestClassImplService#{http://test.ccb.org.com/}getCaseId has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: [Lcom.org.ccb.test.SampleClass; cannot be cast to com.org.ccb.test.SampleClass
at org.apache.cxf.jaxws.interceptors.WrapperClassOutInterceptor.handleMessage(WrapperClassOutInterceptor.java:119)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:243)
at org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:76)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:243)
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:109)
at org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:98)
at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:406)
at org.jboss.wsf.stack.cxf.ServletControllerExt.invoke(ServletControllerExt.java:173)
at org.jboss.wsf.stack.cxf.RequestHandlerImpl.handleHttpRequest(RequestHandlerImpl.java:61)
at org.jboss.wsf.stack.cxf.CXFServletExt.invoke(CXFServletExt.java:163)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:179)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:103)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:159)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:183)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:95)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:451)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.ClassCastException: [Lcom.org.ccb.test.SampleClass; cannot be cast to com.org.ccb.test.SampleClass
at com.org.ccb.test.jaxws.GetCaseIdResponse_WrapperTypeHelper1.createWrapperObject(Unknown Source)
at org.apache.cxf.jaxws.interceptors.WrapperClassOutInterceptor.handleMessage(WrapperClassOutInterceptor.java:103)
... 33 more
** 主要编辑 ** 创建 Web 服务向导生成了 esdl 文件,但它不包含 maxOccurs="unbounded" ,所以我手动添加、保存并重新启动,以为它会改变,但发现 wsdl 没有改变它保留了旧的,所以应该是问题所在!找不到 wsdl 文件没有改变的原因!