You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2009/02/10 21:29:04 UTC

svn commit: r743087 - in /cxf/trunk/rt: core/src/main/java/org/apache/cxf/interceptor/ core/src/main/java/org/apache/cxf/service/invoker/ frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/

Author: dkulp
Date: Tue Feb 10 20:29:03 2009
New Revision: 743087

URL: http://svn.apache.org/viewvc?rev=743087&view=rev
Log:
[CXF-973, CXF-2025] Fixes for various fault related issues
Patches from Will Gomes and Kaj Kandler applied

Modified:
    cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/ClientFaultConverter.java
    cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/invoker/AbstractInvoker.java
    cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WebFaultOutInterceptor.java

Modified: cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/ClientFaultConverter.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/ClientFaultConverter.java?rev=743087&r1=743086&r2=743087&view=diff
==============================================================================
--- cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/ClientFaultConverter.java (original)
+++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/ClientFaultConverter.java Tue Feb 10 20:29:03 2009
@@ -20,6 +20,7 @@
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
+import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -148,8 +149,14 @@
                     Constructor constructor = exClass.getConstructor(new Class[]{String.class});
                     e = constructor.newInstance(new Object[]{fault.getMessage()});
                 } else {
-                    Constructor constructor = getConstructor(exClass, e);
-                    e = constructor.newInstance(new Object[]{fault.getMessage(), e});
+                
+                    try {
+                        Constructor constructor = getConstructor(exClass, e);
+                        e = constructor.newInstance(new Object[]{fault.getMessage(), e});
+                    } catch (NoSuchMethodException e1) {
+                        //Use reflection to convert fault bean to exception
+                        e = convertFaultBean(exClass, e, fault);
+                    }
                 }
                 msg.setContent(Exception.class, e);
             } catch (Exception e1) {
@@ -243,4 +250,47 @@
         }
         return null;
     }
+    
+    private Exception convertFaultBean(Class<?> exClass, Object faultBean, Fault fault) throws Exception {
+        Constructor constructor = exClass.getConstructor(new Class[]{String.class});
+        Exception e = (Exception)constructor.newInstance(new Object[]{fault.getMessage()});
+
+        //Copy fault bean fields to exception
+        for (Class<?> obj = exClass; !obj.equals(Object.class);  obj = obj.getSuperclass()) {   
+            Field[] fields = obj.getDeclaredFields();
+            for (Field f : fields) {
+                try {
+                    Field beanField = faultBean.getClass().getDeclaredField(f.getName());
+                    beanField.setAccessible(true);                    
+                    f.setAccessible(true);
+                    f.set(e, beanField.get(faultBean));
+                } catch (NoSuchFieldException e1) {
+                    //do nothing
+                }
+            }            
+        }
+        //also use/try public getter/setter methods
+        Method meth[] = faultBean.getClass().getMethods();
+        for (Method m : meth) {
+            if (m.getParameterTypes().length == 0
+                && (m.getName().startsWith("get")
+                || m.getName().startsWith("is"))) {
+                try {
+                    String name;
+                    if (m.getName().startsWith("get")) {
+                        name = "set" + m.getName().substring(3);
+                    } else {
+                        name = "set" + m.getName().substring(2);
+                    }
+                    Method m2 = exClass.getMethod(name, m.getReturnType());
+                    m2.invoke(e, m.invoke(faultBean));
+                } catch (Exception e1) {
+                    //ignore
+                }
+            }
+        }
+
+
+        return e;
+    }
 }

Modified: cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/invoker/AbstractInvoker.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/invoker/AbstractInvoker.java?rev=743087&r1=743086&r2=743087&view=diff
==============================================================================
--- cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/invoker/AbstractInvoker.java (original)
+++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/invoker/AbstractInvoker.java Tue Feb 10 20:29:03 2009
@@ -147,10 +147,11 @@
         if (checked) {
             return new Fault(ex);
         } else {
-            return new Fault(new Message("EXCEPTION_INVOKING_OBJECT",
-                                         LOG,
-                                         ex.getMessage(), m.toString(), params),
-                                         ex);
+            String message = (ex == null) ? "" : ex.getMessage(); 
+            String method = (m == null) ? "<null>" : m.toString(); 
+            return new Fault(new Message("EXCEPTION_INVOKING_OBJECT", LOG, 
+                                         message, method, params),
+                                         ex); 
         }
     }
     

Modified: cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WebFaultOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WebFaultOutInterceptor.java?rev=743087&r1=743086&r2=743087&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WebFaultOutInterceptor.java (original)
+++ cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WebFaultOutInterceptor.java Tue Feb 10 20:29:03 2009
@@ -141,15 +141,13 @@
                             && (m.getName().startsWith("get")
                             || m.getName().startsWith("is"))) {
                             try {
-                                Method m2 = cls.getMethod(m.getName(),
-                                                          m.getParameterTypes());
                                 String name;
                                 if (m.getName().startsWith("get")) {
                                     name = "set" + m.getName().substring(3);
                                 } else {
                                     name = "set" + m.getName().substring(2);
                                 }
-                                m2 = cls.getMethod(name, m.getReturnType());
+                                Method m2 = cls.getMethod(name, m.getReturnType());
                                 m2.invoke(ret, m.invoke(cause));
                             } catch (Exception e) {
                                 //ignore