I went ahead and created a JIRA issue for this: https://issues.apache.org/jira/browse/CXF-789
- Dan On 7/13/07, Liu, Jervis <[EMAIL PROTECTED]> wrote:
Hi, I actually believe this is a bug in CXF. What happened in CXF is that we first reflect impl class, all methods defined in impl class become potential candidates for publishing. Then we check interface, if the method under consideration does not exist in the interface, we will fall back to the impl class to do a further check . This is wrong. According to the spec, if the interface is found, we should not look for any information from impl class: " if the WebService annotation on the class under consideration has an endpointInterface element, then the interface referredby this element is for all purposes the SEI associated with the class." Cheers, Jervis -----Original Message----- From: Willem Jiang [mailto:[EMAIL PROTECTED] Sent: 2007?7?13? 14:14 To: [email protected] Subject: Re: Exposing methods Hi, I just dug the code, here is the code in the JaxWsServiceConfiguration to tell which method is the WebMethod. @Override public Boolean isOperation(Method method) { Method origMethod = method; method = getDeclaredMethod(method); if (method.getReturnType().equals(Future.class) || method.getReturnType().equals(Response.class)) { return false; } if (method != null) { WebMethod wm = method.getAnnotation(WebMethod.class); if (wm != null) { if (wm.exclude()) { return Boolean.FALSE; } else { return Boolean.TRUE; } } else { if (method.getDeclaringClass().isInterface()) { return hasWebServiceAnnotation(method) || hasWebServiceAnnotation(origMethod); } return hasWebServiceAnnotation(method); } } return Boolean.FALSE; } private boolean hasWebServiceAnnotation(Method method) { return method.getDeclaringClass().getAnnotation(WebService.class) != null; } And there are some descriptions of the WebMethod definition can explain the code. JAX-WS 2.0 specification (Final Release April 19, 2006) Chapter 3 "Java to WSDL 1.1 Mapping" P30. " In order to allow for a separation between Web service interface and implementation, if the WebService annotation on the class under consideration has a endpointInterface element, then the interface referred by this element is for all purposes the SEI associated with the class. Otherwise, the class implicitly defines a service endpoint interface (SEI) which comprises all of the public methods that satisfy one of the following conditions: 1. They are annotated with the javax.jws.WebMethod annotation with the exclude element set to false or missing (since false is the default for this annotation element). 2. They are not annotated with the javax.jws.WebMethod annotation but their declaring class has a javax.jws.WebService annotation. For mapping purposes, this implicit SEI and its methods are considered to be annotated with the same Web service-related annotations that the original class and its methods have. *In pratice*, in order to exclude a public method of a class annotated with WebService and not directly specifying a endpointInterface from the implicitly defined SEI, it is necessary to annotate the method with a WebMethod annotation with the exclude element set to true." And Jim's suggestion is right , you just need to add the @WebMethod (exclude=true) annotation to the method that you do not want to export as a WebMethod. Cheers, Willem. Jim Ma wrote: > Yes . It's the normal behavior. The runtime will reflect every method > in impl class and expose it unless the > method is annotated with exclude WebMethod . > CXF also can support publishing a service with a pojo class without > implementing any interface : > > @WebService > public class UserWebServiceImpl { > > private UserManager userManager; > @WebMethod (exclude=true) > public void setUserManager(UserManager userManager) { > this.userManager = userManager; > } > @WebMethod > public User getUserById(Long id) { > return userManager.getUser(id); > } > } > > Cheers > > Jim > > Julio Arias wrote: >> Hi Jim, >> >> Thanks I found that property for the @WebMethod annotation too and it >> works fine. But is this a normal behavior to expose everything in the >> implementor, I thought it would only expose the methods on my interface. >> >> On Jul 12, 2007, at 9:05 PM, Jim Ma wrote: >> >>> Hi Julio, >>> >>> I think you can add @WebMethod(exclude=true) for the setter method. >>> >>> @WebMethod (exclude=true) >>> setUserManager(UserManager userManager) >>> >>> Cheers >>> >>> Jim >>> >>> >>> Julio Arias wrote: >>>> The dependencies setters from my service impl are getting expose in >>>> the WSDL even though I'm specifying the endpoint interface in the >>>> implementor. How can I hide this methods? >>>> >>>> I have the following code and config: >>>> >>>> + UserWebService.java >>>> >>>> @WebService(name = "UserService") >>>> public interface UserWebService { >>>> @WebMethod >>>> User getUserById(@WebParam(name = "id") Long id); >>>> } >>>> >>>> + UserWebServiceImpl.java >>>> >>>> @WebService(endpointInterface = >>>> "com.rbx.test.webservices.UserWebService", name = "UserService") >>>> public class UserWebServiceImpl implements UserWebService { >>>> >>>> private UserManager userManager; >>>> >>>> public void setUserManager(UserManager userManager) { >>>> this.userManager = userManager; >>>> } >>>> public User getUserById(Long id) { >>>> return userManager.getUser(id); >>>> } >>>> } >>>> >>>> + Endpoint config: >>>> >>>> <jaxws:endpoint id="userService" address="/UserService"> >>>> <jaxws:implementor> >>>> <bean class="com.rbx.test.webservices.UserWebServiceImpl"> >>>> <property name="userManager" ref="userManager"/> >>>> </bean> >>>> </jaxws:implementor> </jaxws:endpoint> >>>> >>>> >>>> >>>> >>>> Julio Arias >>>> Java Developer >>>> Roundbox Global : enterprise : technology : genius >>>> --------------------------------------------------------------------- >>>> Avenida 11 y Calle 7-9, Barrio Amón, San Jose, Costa Rica >>>> tel: 404.567.5000 ext. 2001 | cell: 11.506.849.5981 >>>> email: [EMAIL PROTECTED] | www.rbxglobal.com >>>> --------------------------------------------------------------------- >>>> >>>> >> >> >> >> >> Julio Arias >> Java Developer >> Roundbox Global : enterprise : technology : genius >> --------------------------------------------------------------------- >> Avenida 11 y Calle 7-9, Barrio Amón, San Jose, Costa Rica >> tel: 404.567.5000 ext. 2001 | cell: 11.506.849.5981 >> email: [EMAIL PROTECTED] | www.rbxglobal.com >> --------------------------------------------------------------------- >> >> > ---------------------------- IONA Technologies PLC (registered in Ireland) Registered Number: 171387 Registered Address: The IONA Building, Shelbourne Road, Dublin 4, Ireland
-- Dan Diephouse Envoi Solutions http://envoisolutions.com | http://netzooid.com/blog
