Apache CXF Web服务问题
我有一个使用Maven的多模块项目。 在其中一个模块中,我有几个使用Apache CXF Framework 2.5.4开发的Web服务。 目前我有两个“问题”或问题。
首先,如果我调用一个应该返回List的Web服务的方法,如果列表为空,则返回“null”而不是空列表。 我试图找出可能是什么问题,如果它是我正在使用的CXF版本的错误,或者我应该使用一些注释来修改方法或响应的定义,但我找不到任何东西。 我见过一些人有同样的问题,但没有解决方案。
我想问的另一件事是:我正在使用MVC模式开发一个Web应用程序。 我想知道我应该从Controller调用Web服务的方式,而不是使用ClasspathXmlCpplicationContext然后使用context.getBean()。
例如,客户端上的一个Web服务的bean定义是:
我已经尝试过@Autowired或@WebServiceRef注释。 有了这些它可以工作,但没有对Web服务做HTTP请求,我想它从本地存储库获取依赖。 我认为我需要的是在Controller上注入这个bean的方法。
回答你的问题
对于您的第一个问题:如果列表为空,则由CXF版本2.6.1正确处理 – 该服务返回空。 只是为了演示我有一个样本服务,其中类型以这种方式定义:
@XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "MemberSearchResponse", namespace="http://bk.org/memberservice/" ) public class MemberSearchResponse { @XmlElementWrapper(name="memberDetails") private List memberDetails;
如果我在上面返回一个空的memberDetails,那么通过网络的xml是这样的:
编辑
它作为上面的包装器类型的一部分被正确处理,但是如果不是返回包装器类型,则DOES返回null,直接返回列表。
考虑以这种方式定义的Webservice接口:
@WebMethod(operationName = "searchMember") List searchMember(@WebParam(name = "MemberSearchRequest") MemberSearchRequest memberSearchRequest);
如果返回的List是一个空列表,它也会被CXF 2.6.1序列化为null。
解决方法是使用包装类型
编辑结束
对于你的第二个问题:
您正在以这种方式创建客户端bean:
一旦你用这种方式创建了一个Spring bean,就可以像普通的Spring bean一样对待它,并按照你对普通Spring bean的方式进行注入,例如,以这种方式注入它:
或使用@Autowired
@Autowired IDWebService deviceWSClient
或用户@Resource
@Resource IDWebService deviceWSClient
这些是注入bean的常用方法。
我在这个github位置有一个示例应用程序,您可以使用: https : //github.com/bijukunjummen/memberservice-codefirst.git
只需使用mvn tomcat:run
启动服务器mvn tomcat:run
并运行测试org.bk.memberservice.TestCxfIntegrationTest
,它将向CXF服务发出请求。
如果您在Spring论坛上关注此链接,@ @WebServiceRef
可能会有效。 在那里你使用不同的方式进行jaxws配置。 请参阅列表中的最后一篇文章。
在这个SO问题上讨论了定义客户端的另一种方法。 有一个解决方案,你在给出一些额外的配置后最终使用@Autowired
注释。 请参阅有关该问题的最后答案。
您提到的另一个问题是关于此cxf列表相关问题 ,其中还告诉解决方案解决问题的方法。 所以这是一个错误。 版本2.2.7已修复,但在版本2.2.9中再次出现问题。 很奇怪,直到你的版本2.5.4它回到错误状态。 如果它能解决你的问题,你可以尝试一下这个问题。
- 获取“ClassNotFoundException:ResteasyBootstrap”和“ClassNotFoundException:SpringContextLoaderListenerexception”
- 当文本发生变化时,如何阻止JLabel更改其大小?
- maven-cxf-codegen-plugin使用Jaxb绑定为所有生成的类添加inheritance
- 将ws-security添加到wsdl2java生成的类中
- 覆盖CXFerror handling
- CXF如何在没有Spring的情况下在CXF端口上设置SoapVersion
- 注释CXF(wsdl2java)生成的包
- 使用CXF捕获webserviceexception:NoClassDefFoundError:SOAPFaultBuilder
- 如何防止Apache CXF发送响应消息?
- 如何使用java解析XOP / MTOM SOAP响应?
- JAX-RS – 在apache CXF中没有根节点的JSON