You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Guttorm Vik (JIRA)" <ji...@apache.org> on 2016/12/06 18:51:58 UTC

[jira] [Created] (CXF-7167) Generated wrapper classes overwrite each other

Guttorm Vik created CXF-7167:
--------------------------------

             Summary: Generated wrapper classes overwrite each other
                 Key: CXF-7167
                 URL: https://issues.apache.org/jira/browse/CXF-7167
             Project: CXF
          Issue Type: Bug
          Components: Core
    Affects Versions: 3.1.6
         Environment: Wildfly 10.1.0, Windows
            Reporter: Guttorm Vik


We have a package with two @WebService classes.
They have a @WebMethod with the same name, but with a different return type.

For each method cxf generates a wrapper class at runtime that has package = the shared package for our web service classes, and class name = the @WebMethod

The result is that the generated class for both these has the same name!
The generated classes have the same method, but with different parameter.

When this is used we will get a Classcast exception at runtime for one of them. 

Some more details:

The classes look like this:
{code}
package com.ec.os.webservices.model.ejb.query;

@WebService(name = "QueryServiceLundnorPrs", targetNamespace = "/com.ec.os.webservices/em/query", serviceName = "QueryServiceLundnorPrs")
public class QueryServiceLundnorPrs extends QueryService {

    @WebMethod
    @WebResult(name="POB")
    public VLundnorPrsPob[] getPob( @WebParam(name = "where") String where) {
        return query(VLundnorPrsPob.class, "V_LUNDNOR_PRS_POB", where);
    }

}
{code}

and this:
{code}
package com.ec.os.webservices.model.ejb.query;

@WebService(name = "QueryServiceLundnorOp", targetNamespace = "/com.ec.os.webservices/lundnorOp/query", serviceName = "QueryServiceLundnorOp", wsdlLocation= "/wsdl/QueryServiceLundnorOp.wsdl")
public class QueryServiceLundnorOp extends QueryService {

    @WebMethod
    @WebResult(name="POB")
    public VLundnorOpPob[] getPob( @WebParam(name = "where") String where) {
        return query(VLundnorOpPob.class, "V_LUNDNOR_OP_POB", where);
    }

}
{code}


At runtime we got:
{code}
java.lang.IllegalArgumentException: java.lang.ClassCastException@55782624 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.cxf.databinding.AbstractWrapperHelper.createWrapperObject(AbstractWrapperHelper.java:114)
at org.apache.cxf.jaxws.interceptors.WrapperClassOutInterceptor.handleMessage(WrapperClassOutInterceptor.java:91)
{code}

I modified the AbstractWrapperHelper.createWrapperObject in cxf-core-3.1.6.jar in WildFly to output the name and class of the object that was called with generics, and same for its parameters.

When running with an ear-directory in Eclipse:
com.ec.os.webservices.model.ejb.query.jaxws_asm.GetPobResponse

When running with a proper ear file:
com.ec.os.webservices.model.ejb.query.jaxws.GetPobResponse

The first part is the common package. The last part is the @WebMethod, I assume, but there is nothing to indicate the @WebService class.

The result is that for two different @WebService classes a wrapper class with the same name is generated, and this gives classcast exceptions.

We have fixed our problem by moving each web service class to its own package.




--
This message was sent by Atlassian JIRA
(v6.3.4#6332)