cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Dan Diephouse" <...@envoisolutions.com>
Subject Re: Exposing methods
Date Fri, 13 Jul 2007 21:21:04 GMT
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 <jliu@iona.com> 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:ning.jiang@iona.com]
> Sent: 2007?7?13? 14:14
> To: cxf-user@incubator.apache.org
> 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: julio.arias@rbxglobal.com | 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: julio.arias@rbxglobal.com | 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

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message