Служба Java JAX-WS, возвращающая ошибку SOAP при запросе модуля Perl SOAP :: Lite - PullRequest
3 голосов
/ 05 ноября 2011

У меня есть простой Java-сервис для получения текущего времени.

Я написал Perl-клиент для доступа к нему.

#! /usr/bin/perl -w
use SOAP::Lite;
my $url = 'http://127.0.0.1:9876/ts?wsdl';
my $service = SOAP::Lite->service($url)->soapversion('1.1');

print "\nCurrent time is: ", $service->getTimeAsString();
print "\nElapsed milliseconds from the epoch: ", $service->getTimeAsElapsed();

Как только клиент выполняет вызов (также на той же машине), служба регистрирует исключение, указанное ниже, и ошибка SOAP возвращается клиенту вместо ожидаемого ответа.

Nov 05, 2011 11:20:34 AM com.sun.xml.internal.ws.transport.http.HttpAdapter$Http Toolkit handle
SEVERE: Couldn't create SOAP message. Expecting Envelope in namespace http://sch
emas.xmlsoap.org/soap/envelope/, but got http://schemas.xmlsoap.org/wsdl/soap/
com.sun.xml.internal.ws.protocol.soap.VersionMismatchException: Couldn't create
SOAP message. Expecting Envelope in namespace http://schemas.xmlsoap.org/soap/en
velope/, but got http://schemas.xmlsoap.org/wsdl/soap/
at com.sun.xml.internal.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCod ec.java:167)
at com.sun.xml.internal.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCod ec.java:292)
at com.sun.xml.internal.ws.encoding.StreamSOAPCodec.decode(StreamSOAPCod ec.java:118)
at com.sun.xml.internal.ws.encoding.SOAPBindingCodec.decode(SOAPBindingCodec.java:343)
at com.sun.xml.internal.ws.transport.http.HttpAdapter.decodePacket(HttpAdapter.java:321)
at com.sun.xml.internal.ws.transport.http.HttpAdapter.access$400(HttpAdapter.java:81)
at com.sun.xml.internal.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:576)
at com.sun.xml.internal.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:244)
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:77)
at sun.net.httpserver.AuthFilter.doFilter(AuthFilter.java:83)
at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:80)
at sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(ServerImpl.java:665)
at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:77)
at sun.net.httpserver.ServerImpl$Exchange.run(ServerImpl.java:637)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)

Есть идеи почему?

Ответы [ 2 ]

2 голосов
/ 30 октября 2013

Немного поздно, но для всех, у кого есть эта проблема, проблема в том, что SOAP :: Lite слепо импортирует пространства имен из файла WSDL и перезаписывает свои собственные на основе используемых там префиксов, включая пространство имен, которое он использует отправить сам конверт SOAP.

Решение состоит в том, чтобы заставить его использовать другой префикс пространства имен для конверта SOAP, используя метод envprefix. Например:

my $service = SOAP::Lite->service($url)->soapversion('1.1')->envprefix('S');

0 голосов
/ 05 ноября 2011

Ваш клиент Python отправляет XML в формате, отличном от ожидаемого вашей веб-службой Java. Чтобы увидеть, что действительно отправляет ваш клиент, я предлагаю вам использовать следующий инструмент

http://code.google.com/p/tcpmon/

Это позволит вам проверить отправленный XML и изменить его, если хотите. Вот учебник о том, как использовать TcpMon

http://ws.apache.org/commons/tcpmon/tcpmontutorial.html

...