You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by ff...@apache.org on 2012/11/15 07:06:33 UTC

svn commit: r1409656 - in /cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb: JAXBContextInitializer.java JAXBEncoderDecoder.java Utils.java

Author: ffang
Date: Thu Nov 15 06:06:32 2012
New Revision: 1409656

URL: http://svn.apache.org/viewvc?rev=1409656&view=rev
Log:
[CXF-4594]when use code first, If no setter method in Exception class, the property can't get marshalled nor available in generated wsdl

Modified:
    cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBContextInitializer.java
    cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java
    cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/Utils.java

Modified: cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBContextInitializer.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBContextInitializer.java?rev=1409656&r1=1409655&r2=1409656&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBContextInitializer.java (original)
+++ cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBContextInitializer.java Thu Nov 15 06:06:32 2012
@@ -379,8 +379,9 @@ class JAXBContextInitializer extends Ser
     static boolean isMethodAccepted(Method method, XmlAccessType accessType) {
         // We only accept non static property getters which are not marked @XmlTransient
         if (Modifier.isStatic(method.getModifiers()) 
-            || method.isAnnotationPresent(XmlTransient.class)
-            || !Modifier.isPublic(method.getModifiers())) {
+                || method.isAnnotationPresent(XmlTransient.class)
+                || !Modifier.isPublic(method.getModifiers())
+                || "getClass".equals(method.getName())) {
             return false;
         }
 
@@ -390,11 +391,17 @@ class JAXBContextInitializer extends Ser
             || method.getDeclaringClass().equals(Throwable.class)) {
             return false;
         }
-
+        if (method.getName().startsWith("get")
+                || method.getName().startsWith("is")) { 
+                //continue with below check.
+        } else {
+            return false;
+        }
         int beginIndex = 3;
         if (method.getName().startsWith("is")) {
             beginIndex = 2;
         }
+        
         Method setter = null;
         try {
             setter = method.getDeclaringClass()
@@ -403,10 +410,11 @@ class JAXBContextInitializer extends Ser
         } catch (Exception e) {
             //getter, but no setter
         }
-        if (setter == null 
-            || setter.isAnnotationPresent(XmlTransient.class)
-            || !Modifier.isPublic(setter.getModifiers())) {
+        if ((setter != null) 
+                && ((setter.isAnnotationPresent(XmlTransient.class)
+                 || !Modifier.isPublic(setter.getModifiers())))) {
             return false;
+             
         }
 
         if (accessType == XmlAccessType.NONE

Modified: cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java?rev=1409656&r1=1409655&r2=1409656&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java (original)
+++ cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBEncoderDecoder.java Thu Nov 15 06:06:32 2012
@@ -488,7 +488,7 @@ public final class JAXBEncoderDecoder {
                         m = Utils.getMethod(cls, accessType, "is" + s);
                     }
                     Type type = m.getGenericReturnType();
-                    Method m2 = Utils.getMethod(cls, accessType, "set" + s, m.getReturnType());
+                    Object o = null;
                     if (JAXBSchemaInitializer.isArray(type)) {
                         Class<?> compType = JAXBSchemaInitializer
                             .getArrayComponentType(type);
@@ -496,7 +496,7 @@ public final class JAXBEncoderDecoder {
                                                            q,
                                                            compType,
                                                            createList(type));
-                        Object o = ret;
+                        o = ret;
                         if (!isList(type)) {
                             if (compType.isPrimitive()) {
                                 o = java.lang.reflect.Array.newInstance(compType, ret.size());
@@ -507,12 +507,23 @@ public final class JAXBEncoderDecoder {
                                 o = ret.toArray((Object[])Array.newInstance(compType, ret.size()));
                             }
                         }
-
-                        m2.invoke(obj, o);
                     } else {
-                        Object o = getElementValue(u.unmarshal(reader, Utils.getMethodReturnType(m)));
-                        Utils.setMethodValue(m, m2, obj, o);
+                        o = getElementValue(u.unmarshal(reader, Utils.getMethodReturnType(m)));
                     }
+                    Method m2 = Utils.getMethod(cls, accessType, "set" + s, m.getReturnType());
+                    if (m2 != null) {
+                        if (JAXBSchemaInitializer.isArray(type)) {
+                            m2.invoke(obj, o);
+                        } else {
+                            Utils.setMethodValue(m, m2, obj, o);
+                        }
+                    } else {
+                        Field fn = ReflectionUtil.getDeclaredField(cls, q.getLocalPart());
+                        if (fn != null) {
+                            ReflectionUtil.setAccessible(fn);
+                            fn.set(obj, o);
+                        }
+                    }                
                 }
             }
             return (Exception)obj;

Modified: cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/Utils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/Utils.java?rev=1409656&r1=1409655&r2=1409656&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/Utils.java (original)
+++ cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/Utils.java Thu Nov 15 06:06:32 2012
@@ -136,7 +136,8 @@ final class Utils {
         if (method.isBridge()
                 || Modifier.isStatic(method.getModifiers())
                 || method.isAnnotationPresent(XmlTransient.class)
-                || method.getDeclaringClass().equals(Throwable.class)) {
+                || method.getDeclaringClass().equals(Throwable.class)
+                || "getClass".equals(method.getName())) {
             return false;
         }
         // Allow only public methods if PUBLIC_MEMBER access is requested
@@ -169,6 +170,9 @@ final class Utils {
                 String setterName = "set" + m.getName().substring(index);
                 Class<?> paramTypes = m.getReturnType();
                 Method setter = getDeclaredMethod(declaringClass, setterName, paramTypes);
+                if (setter == null) {
+                    return true;
+                }
                 if (setter != null && !setter.isAnnotationPresent(XmlTransient.class)) {
                     return true;
                 }