2016-12-15 7 views
0

У меня есть приложение java, отображающее API SOAP через Jetty. Я могу успешно получить доступ к WSDL и подделать запрос, но отправляемый webparam всегда имеет значение null. Я не знаю, как отладить эту проблему. Здесь у меня есть несколько фрагментов функций, участвующих в запросе. Я буду править, если вам нужна дополнительная информация:@WebParam всегда имеет значение null в портье для порций

@WebMethod(
     operationName = "findEvent" 
    ) 
    public ServiceEventDto findEvent(
      @WebParam(name = "eventId") Long eventId) throws InstanceNotFoundException { 
     Event event 
       = EventServiceFactory.getService().findEvent(eventId); 
     return EventToEventDtoConversor.toEventDto(event); 
    } 

Это запрос:

<x:Envelope xmlns:x="http://schemas.xmlsoap.org/soap/envelope/" xmlns:eve="http://ws.udc.es/event"> 
<x:Header/> 
<x:Body> 
    <eve:findEvent> 
     <eve:eventId>0</eve:eventId> 
    </eve:findEvent> 
</x:Body> 

Спасибо заранее.

+0

поэтому код имеет findInvite и inviteId и XML имеет findEvent и eventId – slipperyseal

+0

@SlipperySeal Извините, я скопировал неправильный код, теперь я исправлю его. –

ответ

1

Я считаю, что проблема в том, что ваш вход SOAP использует префикс пространства имен для входного элемента eventId.

Попробуйте это:

<x:Envelope xmlns:x="http://schemas.xmlsoap.org/soap/envelope/" xmlns:eve="http://ws.udc.es/event"> 
<x:Header/> 
<x:Body> 
    <eve:findEvent> 
     <eventId>0</eventId> 
    </eve:findEvent> 
</x:Body> 

я смог воссоздать с помощью следующего поставщика услуг в Jetty 9.4:

служба конечных точек интерфейса: реализация

package org.example.sampleservice; 

import javax.jws.WebMethod; 
import javax.jws.WebParam; 
import javax.jws.WebService; 

@WebService(targetNamespace="http://ws.udc.es/event") 
public interface SampleService { 

    @WebMethod(operationName = "findEvent") 
     public ServiceEventDto findEvent(@WebParam(name = "eventId") Long eventId) throws InstanceNotFoundException; 

} 

Услуги:

package org.example.sampleservice; 

import javax.annotation.Resource; 
import javax.jws.WebMethod; 
import javax.jws.WebParam; 
import javax.jws.WebService; 
import javax.xml.ws.WebServiceContext; 

@WebService(endpointInterface = "org.example.sampleservice.SampleService", targetNamespace="http://ws.udc.es/event") 
public class SampleServiceImpl implements SampleService { 

    @Resource 
    private WebServiceContext ctx; 

    @WebMethod(operationName = "findEvent") 
    public ServiceEventDto findEvent(@WebParam(name = "eventId") Long eventId) throws InstanceNotFoundException { 
     System.out.println("SampleServiceImpl: received eventId " + eventId); 
     return new ServiceEventDto(); 
    } 

} 

Когда я использую свой оригинальный вход с <eve:eventId>0</eve:eventId> я наблюдаю следующий вывод:

SampleServiceImpl: received eventId null

Когда я использую <eventId>0</eventId> наблюдаю ожидаемый результат:

SampleServiceImpl: received eventId 0

Если, однако, вы как ожидается, примет <eve:eventId>, вы также можете настроить @WebParam, чтобы добавить targetNamespace следующим образом:

@WebParam(name = "eventId", targetNamespace="http://ws.udc.es/event") Long eventId 

Когда я изменить мой поставщик услуг таким образом, выходной сигнал не изменится и <eve:eventId> больше не null.

+0

Это должно быть принято как решение. Добавление 'targetNamespace' помогло мне решить аналогичную проблему. – zygimantus