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

Reply via email to