我有一个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>
提前谢谢。
答案 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
。