@abParam在jetty服务肥皂时始终为空

时间:2016-12-15 01:53:21

标签: java web-services soap jetty jax-ws

我有一个Java应用程序通过Jetty公开SOAP API。我可以成功访问我的WSDL并伪造请求,但发送的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>

提前谢谢。

1 个答案:

答案 0 :(得分:2)

我认为问题在于您的SOAP输入使用eve命名空间前缀作为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