You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Alessio Soldano (JIRA)" <ji...@apache.org> on 2014/11/11 18:48:33 UTC

[jira] [Resolved] (CXF-6089) XmlAccessorOrder.ALPHABETICAL, Exception.getMessage() duplicate WSDL elements generated

     [ https://issues.apache.org/jira/browse/CXF-6089?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Alessio Soldano resolved CXF-6089.
----------------------------------
    Resolution: Fixed

Patch applied, thanks!

> XmlAccessorOrder.ALPHABETICAL, Exception.getMessage() duplicate WSDL elements generated
> ---------------------------------------------------------------------------------------
>
>                 Key: CXF-6089
>                 URL: https://issues.apache.org/jira/browse/CXF-6089
>             Project: CXF
>          Issue Type: Bug
>    Affects Versions: 2.7.13
>            Reporter: Rebecca Searls
>            Assignee: Alessio Soldano
>             Fix For: 3.1.0, 3.0.3, 2.7.14
>
>         Attachments: CXF-6089.patch, testApp.zip
>
>
> When presented with a custom exception class with a XmlAccessorOrder.ALPHABETICAL
> annotation attribute the Exception.getMessage() method is listed twice as an element in a generated WSDL.
> The cause of duplicate message elements being listed in the generated WSDL
> is a duplication of the processing of "cls" by Utils.getGetters at line
> 562 and addExceptionMessage() at line 587. Utils.getGetters checks for an 
> Exception class defining method, getMessage.  If method, "getMessage" is NOT 
> annotated with @XmlTransient it is returned as a method to be processed and 
> added to "seq" (lines 575-581) .  A similar evaluation is performed by 
> addExceptionMessage().  It adds a second ref to "getMessage" to "seq" when 
> @XmlTransient is not present on the method, hence the duplicate elements in 
> the WSDL.   
> This same basic code exists back to version (2.6.x-fixes)
>   http://svn.apache.org/repos/asf/cxf/branches/2.6.x-fixes
> I did not check version prior to that.
> {code}
> -----
> org.apache.cxf.jaxb.JAXBSchemaInitializer
>   562        for (Method m : Utils.getGetters(cls, accessType)) {
>   ..........
>   575                JAXBBeanInfo beanInfo = getBeanInfo(type);
>   576                if (beanInfo != null) {
>   577                    int idx = m.getName().startsWith("get") ? 3 : 2;
>   578                    String name = m.getName().substring(idx);
>   579                    name = Character.toLowerCase(name.charAt(0)) + name.substring(1);
>   580                    XmlElement  xmlElementAnno =  m.getAnnotation(XmlElement.class);
>   581                    addElement(schema, seq, beanInfo, new QName(namespace, name), isArray(type), xmlElementAnno);
>                   }
>               }
>           }
>           // Create element in xsd:sequence for Exception.class
>           if (Exception.class.isAssignableFrom(cls)) {
>   587            addExceptionMessage(cls, schema, seq);
>           }
> -----
> org.apache.cxf.jaxb.JAXBSchemaInitializer
>       private void addExceptionMessage(Class<?> cls, XmlSchema schema, XmlSchemaSequence seq) {
>           try {
>               //a subclass could mark the message method as transient
>   611            Method m = cls.getMethod("getMessage");
>   612            if (!m.isAnnotationPresent(XmlTransient.class)) {
>                   JAXBBeanInfo beanInfo = getBeanInfo(java.lang.String.class);
>                   XmlSchemaElement exEle = new XmlSchemaElement(schema, false);
>                   exEle.setName("message");
>                   exEle.setSchemaTypeName(getTypeName(beanInfo));
>                   exEle.setMinOccurs(0);
>   618                seq.getItems().add(exEle);
>               }
>           } catch (Exception e) {
>               //ignore, just won't have the message element
>           }
> -----
> org.apache.cxf.jaxb.Utils
>   121        if (method.isBridge()
>   122                || Modifier.isStatic(method.getModifiers())
>   123 >>               || method.isAnnotationPresent(XmlTransient.class)
>   124                || method.getDeclaringClass().equals(Throwable.class)
>   125                || "getClass".equals(method.getName())) {
>   126            return false;
>           }
> {code}



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