问题描述
与我之前的问题没什么不同.我想将这些保留为 2 个单独的问题(因为另一个问题已得到回答).
Little different from my previous question. I want to keep these as 2 individual questions (as the other one was answered).
我有一个网络服务,我想将 Vector>
或 ArrayList>
传回给客户端.为此,我为此创建了一个简单的 POJO 类(感谢 Abhisek Bose),称为 VectorWS
.使用Vector
的实现如下:
I have a web service which I want to pass back a Vector<Vector<Object>>
or ArrayList<ArrayList<Object>>
to the client. For this I have created a simple POJO class (thanks Abhisek Bose) for this called VectorWS
. The implementation using the Vector
is as follows:
public class VectorWS {
private Vector vector;
public VectorWS() {
}
public VectorWS(Vector v) {
vector = v;
}
public Vector getVector() {
return vector;
}
public void setVector(Vector vector) {
this.vector = vector;
}
}
接口实现如下:
@WebService
@SOAPBinding(style = Style.RPC)
public interface ISQLServerConnectionWS {
@WebMethod
VectorWS executeSelectSQL(@WebParam(name = "sqlStatements") String sqlStatements);
}
服务器实现如下:
@WebService(endpointInterface="WebServices.ISQLServerConnectionWS")
public class SQLConnectionWSServer
implements ISQLServerConnectionWS {
@Override
public VectorWS executeSelectSQL(String sqlStatements) {
System.out.println("You are calling executeSelectSQL with " + sqlStatements );
Vector results = new Vector();
Vector row1 = new Vector();
Vector row2 = new Vector();
row1.add( "Name" );
row2.add( "Asamoah" );
results.add( row1 );
results.add( row2 );
VectorWS vws = new VectorWS(new ArrayList(results));
return vws;
}
}
客户端调用服务器服务方法为:
Client calls the server service method as:
VectorWS results = server.executeSelectSQL( sqlStatements );
但是,当返回 vws
时,服务器会抛出异常.我已经为 Vector
和 ArrayList
尝试了这个.
However, the server throws an exception when the vws
is returned. I have tried this for both Vector
and ArrayList
.
可以在帖子末尾找到此实例中的异常(来自 ArrayList).
The exception (from the ArrayList) in this instance can be found at the end of the post.
我的问题是,如果我们不能返回 ArrayList>
有什么建议?唯一想到的是ArrayList
.有什么想法吗?
My question is if we cannot return ArrayList<ArrayList<Object>>
what would one recommend?Only thing that comes to mind would be ArrayList<Object[]>
. Any ideas?
非常感谢,
安德斯
这是异常堆栈跟踪:
javax.xml.ws.WebServiceException: javax.xml.bind.MarshalException
- with linked exception:
[javax.xml.bind.JAXBException: class java.util.ArrayList nor any of its super class is known to this context.]
at com.sun.xml.internal.ws.message.jaxb.JAXBMessage.writePayloadTo(JAXBMessage.java:318)
at com.sun.xml.internal.ws.message.AbstractMessageImpl.writeTo(AbstractMessageImpl.java:131)
at com.sun.xml.internal.ws.encoding.StreamSOAPCodec.encode(StreamSOAPCodec.java:98)
at com.sun.xml.internal.ws.encoding.SOAPBindingCodec.encode(SOAPBindingCodec.java:249)
at com.sun.xml.internal.ws.transport.http.HttpAdapter.encodePacket(HttpAdapter.java:328)
at com.sun.xml.internal.ws.transport.http.HttpAdapter.access$100(HttpAdapter.java:82)
at com.sun.xml.internal.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:470)
at com.sun.xml.internal.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:233)
at com.sun.xml.internal.ws.transport.http.server.WSHttpHandler.handleExchange(WSHttpHandler.java:95)
at com.sun.xml.internal.ws.transport.http.server.WSHttpHandler.handle(WSHttpHandler.java:80)
at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:65)
at sun.net.httpserver.AuthFilter.doFilter(AuthFilter.java:65)
at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:68)
at sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(ServerImpl.java:555)
at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:65)
at sun.net.httpserver.ServerImpl$Exchange.run(ServerImpl.java:527)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
Caused by: javax.xml.bind.MarshalException
- with linked exception:
[javax.xml.bind.JAXBException: class java.util.ArrayList nor any of its super class is known to this context.]
at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:268)
at com.sun.xml.internal.bind.v2.runtime.BridgeImpl.marshal(BridgeImpl.java:89)
at com.sun.xml.internal.bind.api.Bridge.marshal(Bridge.java:130)
at com.sun.xml.internal.ws.message.jaxb.JAXBMessage.writePayloadTo(JAXBMessage.java:310)
... 18 more
Caused by: javax.xml.bind.JAXBException: class java.util.ArrayList nor any of its super class is known to this context.
at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:234)
at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:249)
at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:641)
at com.sun.xml.internal.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:54)
at com.sun.xml.internal.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:157)
at com.sun.xml.internal.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:141)
at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:321)
at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:687)
at com.sun.xml.internal.bind.v2.runtime.BridgeImpl.marshal(BridgeImpl.java:136)
at com.sun.xml.internal.bind.v2.runtime.CompositeStructureBeanInfo.serializeBody(CompositeStructureBeanInfo.java:96)
at com.sun.xml.internal.bind.v2.runtime.CompositeStructureBeanInfo.serializeBody(CompositeStructureBeanInfo.java:44)
at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:687)
at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:263)
... 21 more
Caused by: javax.xml.bind.JAXBException: class java.util.ArrayList nor any of its super class is known to this context.
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getBeanInfo(JAXBContextImpl.java:554)
at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:636)
... 31 more
推荐答案
您是否尝试过序列化对象,然后在序列化上运行 Base64,通过线路返回,然后解码 base64 并在收到后反序列化?
Have you tried Serializing the object, then running Base64 on the serialization, returning that over the wire, and then decoding the base64 and deserializing upon receipt?
基本上,您的方法现在将返回一个字符串,即列表/向量的 Base64 编码序列化,并且接收器需要对字符串进行解编码并对对象进行解码.
Basically your method now would return a string, that is the Base64 encoded serialization of the List/Vectors, and the receiver would need to unencode the string and decode the object.
我已经使用这种技术来序列化和反序列化复杂的列表和向量对象.
I have used this sort of technique to serialize and deserialize complex list and vector objects.
这篇关于Java Web 服务并返回 Vector<Vector<Object>>的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!