回答您的问题
对于你的第一个问题:如果列表为空,CXF 版本 2.6.1 会正确处理该列表 - 服务返回空。只是为了演示我有一个示例服务,其中类型是这样定义的:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "MemberSearchResponse", namespace="http://bk.org/memberservice/" )
public class MemberSearchResponse {
@XmlElementWrapper(name="memberDetails")
private List<MemberDetail> memberDetails;
如果我在上面返回一个空的 memberDetails,则通过网络传输的 xml 如下:
<ns2:searchMemberResponse xmlns:ns2="http://bk.org/memberservice/">
<ns2:MemberSearchResponse>
<memberDetails/>
</ns2:MemberSearchResponse>
</ns2:searchMemberResponse>
EDIT
它像上面一样作为包装器类型的一部分被正确处理,但如果不是返回包装器类型,而是直接返回列表,则确实返回 null。
考虑这样定义的 Web 服务接口:
@WebMethod(operationName = "searchMember")
List<MemberDetail> searchMember(@WebParam(name = "MemberSearchRequest") MemberSearchRequest memberSearchRequest);
如果返回的列表是空列表,CXF 2.6.1 也会将其序列化为 null。
解决方法是使用包装类型
EDIT END
对于你的第二个问题:
您可以通过以下方式创建客户端 Bean:
<jaxws:client id="deviceWSClient"
serviceClass="..IDeviceWebService"
address="http://localhost:8080/../DeviceWS" />
一旦你以这种方式创建了一个 Spring bean,你就可以像对待普通 Spring bean 一样对待它,并像对待任何普通 Spring bean 一样注入它,例如,可以这样注入:
<bean id="consumerBean" class="...">
<property name="deviceWS" ref="deviceWSClient">
</bean>
or use @Autowired
@Autowired IDWebService deviceWSClient
Or user @Resource
@Resource IDWebService deviceWSClient
这些是注入 Bean 的常用方法。
我在这个 github 位置有一个示例应用程序,您可以使用:https://github.com/bijukunjummen/memberservice-codefirst.git https://github.com/bijukunjummen/memberservice-codefirst.git
只需使用启动服务器mvn tomcat:run
并运行测试org.bk.memberservice.TestCxfIntegrationTest
这将向 CXF 服务发出请求。