Uploaded image for project: 'CXF'
  1. CXF
  2. CXF-6089

XmlAccessorOrder.ALPHABETICAL, Exception.getMessage() duplicate WSDL elements generated

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 2.7.13
    • 3.0.3, 2.7.14, 3.1
    • None
    • None
    • Unknown

    Description

      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.

      -----
      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;
                }
      

      Attachments

        1. CXF-6089.patch
          2 kB
          Rebecca Searls
        2. testApp.zip
          75 kB
          Rebecca Searls

        Activity

          People

            asoldano Alessio Soldano
            rsearls Rebecca Searls
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: