Apache CXF web services problems

时间秒杀一切 提交于 2019-12-21 20:54:15

问题


I have a multi-module project using Maven. On one of the modules I have several web services developed using Apache CXF Framework 2.5.4. At the moment I have two "problems" or questions.

First of all, if I call to a method of one of the web services that should return a List, if the list is empty, it returns "null" instead of the empty list. I was trying to find out what could be the problem, if it's a bug of the CXF version I'm using or if I should use some annotation to modify the definition of the method or the response, but I couldn't find anything. I've seen some people with the same problem, but no solution.

The other thing I wanted to ask is: I'm developing a web application using MVC pattern. I'm wondering which way I should call the web service from the Controller instead of using ClasspathXmlCpplicationContext and then context.getBean().

For example, the bean definition for one of the web services on the client side is:

<jaxws:client id="deviceWSClient"
        serviceClass="..IDeviceWebService"
        address="http://localhost:8080/../DeviceWS" /> 

I've already tried usin @Autowired or @WebServiceRef annotations. With these it works but not doing a HTTP request to the web service, I guess it gets the dependency from the local repository. I think what I need is the way of injecting this bean on the Controller.


回答1:


To answer your questions

For your first question: If the list is empty it is correctly handled by CXF version 2.6.1 - the service returns a empty. Just to demonstrate I have a sample service where types are defined this way:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "MemberSearchResponse", namespace="http://bk.org/memberservice/" )
public class MemberSearchResponse {

    @XmlElementWrapper(name="memberDetails")
    private List<MemberDetail> memberDetails;

If I return a empty memberDetails above, the xml that goes over the wire is this:

    <ns2:searchMemberResponse xmlns:ns2="http://bk.org/memberservice/">
        <ns2:MemberSearchResponse>
           <memberDetails/>
        </ns2:MemberSearchResponse>
    </ns2:searchMemberResponse>

EDIT

It is correctly handled as part of a wrapper type like above, but DOES return null if instead of returning a wrapper type, the list is directly returned.

Consider a Webservice interface defined this way:

@WebMethod(operationName = "searchMember")
    List<MemberDetail> searchMember(@WebParam(name = "MemberSearchRequest") MemberSearchRequest memberSearchRequest);

If the List returned is an Empty list, it gets serialized as null by CXF 2.6.1 also.

The workaround is to use a wrapper type

EDIT END

For your second question:

You are creating a client bean this way:

<jaxws:client id="deviceWSClient"
        serviceClass="..IDeviceWebService"
        address="http://localhost:8080/../DeviceWS" /> 

Once you have created a Spring bean this way, you can treat it just like a normal Spring bean and inject it the way you would do with any normal Spring bean, for eg, either inject it this way:

 <bean id="consumerBean" class="...">
    <property name="deviceWS" ref="deviceWSClient">
 </bean>

or use @Autowired

@Autowired IDWebService deviceWSClient

Or user @Resource

@Resource IDWebService deviceWSClient

These are the usual ways of injecting in a bean.

I have a sample application at this github location that you can play with: https://github.com/bijukunjummen/memberservice-codefirst.git

Just start up the server using mvn tomcat:run and run a test org.bk.memberservice.TestCxfIntegrationTest which will make a request to the CXF service.




回答2:


@WebServiceRef probably works if you follow this link on Spring forum. There you use different way for jaxws configuration. See the last post on the list.

Another ways to define the client are discussed on this SO question. There is e.g a solution where you finally use @Autowired annotation after you have given some extra configuration. See the last answer on the question.

The another issue you mentioned was about this cxf List related issue where also a solution is told for a workaround to the problem. So it is a bug. Version 2.2.7 has it fixed, but again in version 2.2.9 problem is arisen again. Wierd that until your version 2.5.4 it is back on error state. You could try the work around still, if it fixes the issue for you.



来源:https://stackoverflow.com/questions/11384986/apache-cxf-web-services-problems

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!