Веб-сервисы Java и возвращающий Вектор - PullRequest
0 голосов
/ 07 июля 2011

Немного отличается от моего предыдущего вопроса. Я хочу сохранить их как 2 отдельных вопроса (так как на другой был дан ответ).

У меня есть веб-сервис, который я хочу передать клиенту Vector<Vector<Object>> или ArrayList<ArrayList<Object>>. Для этого я создал простой класс POJO (спасибо Abhisek Bose), который называется VectorWS. Реализация с использованием Vector выглядит следующим образом:

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;           
    }
}

Клиент вызывает метод обслуживания сервера как:

VectorWS results = server.executeSelectSQL( sqlStatements );

Однако сервер выдает исключение при возврате vws. Я пробовал это для Vector и ArrayList.

Исключение (из ArrayList) в этом случае можно найти в конце поста.

У меня вопрос: если мы не сможем вернуть ArrayList<ArrayList<Object>>, что посоветуете? Единственное, что приходит на ум, будет ArrayList<Object[]>. Есть идеи?

Большое спасибо,

Andez

Вот трассировка стека исключений:

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

Ответы [ 2 ]

1 голос
/ 07 июля 2011

Вы пытались сериализовать объект, затем запустить Base64 при сериализации, вернуть его по проводам, а затем декодировать base64 и десериализовать при получении?

По сути, ваш метод теперь возвращает строку, то естьзакодированная в Base64 сериализация списка / векторов, и получатель должен будет расшифровать строку и декодировать объект.

Я использовал этот вид техники для сериализации и десериализации сложного списка и векторных объектов.

0 голосов
/ 07 июля 2011

Вкратце, исходя из ответа пользователя 756212, VectorWS можно сериализовать / десериализовать с помощью:

public String serialize(Object o) {
        String s;
        ByteArrayOutputStream stream = new ByteArrayOutputStream();

        XMLEncoder encoder = new XMLEncoder( new BufferedOutputStream( stream ) );

        encoder.writeObject(o);
        encoder.close();
        s = stream.toString();
        return s;
    }

private Object deserialize(String s) {

    XMLDecoder decoder = new XMLDecoder( new ByteArrayInputStream( s.getBytes() ) );
    return decoder.readObject();
}

И вызывать с помощью:

VectorWS vws = (VectorWS) deserialize( results );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...