[CXF-4242] Adjust how the exception is output in the stack trace as well as how it's created on the client. Fixes the failing tests
Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/865eb64d Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/865eb64d Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/865eb64d Branch: refs/heads/master Commit: 865eb64d44fd4e904f166cb03b0d15ca8b5f0ba5 Parents: e8f57cc Author: Daniel Kulp <dk...@apache.org> Authored: Thu Nov 13 13:16:37 2014 -0500 Committer: Daniel Kulp <dk...@apache.org> Committed: Thu Nov 13 13:19:44 2014 -0500 ---------------------------------------------------------------------- .../cxf/interceptor/ClientFaultConverter.java | 27 +++++++++++++++++--- .../interceptor/AbstractSoapInterceptor.java | 3 ++- .../details/Soap11ClientServerTest.java | 2 +- .../details/Soap12ClientServerTest.java | 1 + 4 files changed, 28 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/865eb64d/core/src/main/java/org/apache/cxf/interceptor/ClientFaultConverter.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/cxf/interceptor/ClientFaultConverter.java b/core/src/main/java/org/apache/cxf/interceptor/ClientFaultConverter.java index 9f2a178..3391779 100644 --- a/core/src/main/java/org/apache/cxf/interceptor/ClientFaultConverter.java +++ b/core/src/main/java/org/apache/cxf/interceptor/ClientFaultConverter.java @@ -260,8 +260,14 @@ public class ClientFaultConverter extends AbstractInDatabindingInterceptor { if (!stackTraceList.isEmpty()) { StackTraceElement[] stackTraceElement = new StackTraceElement[stackTraceList.size()]; e.setStackTrace(stackTraceList.toArray(stackTraceElement)); - } - if (cause != null) { + } else if (cause != null + && cause.getMessage() != null + && cause.getMessage().startsWith(e.getClass().getName())) { + e.setStackTrace(cause.getStackTrace()); + if (cause.getCause() != null) { + e.initCause(cause.getCause()); + } + } else if (cause != null) { e.initCause(cause); } } @@ -273,7 +279,22 @@ public class ClientFaultConverter extends AbstractInDatabindingInterceptor { private Throwable getCause(Iterator<String> linesIterator, String firstLine) { // The actual exception class of the cause might be unavailable at the // client -> use a standard throwable to represent the cause. - Throwable res = new Throwable(firstLine.substring(firstLine.indexOf(":") + 2)); + firstLine = firstLine.substring(firstLine.indexOf(":") + 1).trim(); + Throwable res = null; + if (firstLine.indexOf(":") != -1) { + String cn = firstLine.substring(0, firstLine.indexOf(":")).trim(); + if (cn.startsWith("java.lang")) { + try { + res = (Throwable)Class.forName(cn).getConstructor(String.class) + .newInstance(firstLine.substring(firstLine.indexOf(":") + 2)); + } catch (Throwable t) { + //ignore, use the default + } + } + } + if (res == null) { + res = new Throwable(firstLine); + } List<StackTraceElement> stackTraceList = new ArrayList<StackTraceElement>(); while (linesIterator.hasNext()) { String oneLine = linesIterator.next(); http://git-wip-us.apache.org/repos/asf/cxf/blob/865eb64d/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/AbstractSoapInterceptor.java ---------------------------------------------------------------------- diff --git a/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/AbstractSoapInterceptor.java b/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/AbstractSoapInterceptor.java index 1815a99..096ca02 100644 --- a/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/AbstractSoapInterceptor.java +++ b/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/interceptor/AbstractSoapInterceptor.java @@ -72,7 +72,8 @@ public abstract class AbstractSoapInterceptor extends AbstractPhaseInterceptor<S if (config && fault.getCause() != null) { StringBuilder sb = new StringBuilder(); Throwable throwable = fault.getCause(); - sb.append(throwable.getClass().getCanonicalName() + " : " + throwable.getMessage() + "\n"); + sb.append("Caused by: ").append(throwable.getClass().getCanonicalName()) + .append(": " + throwable.getMessage() + "\n").append(Message.EXCEPTION_CAUSE_SUFFIX); while (throwable != null) { for (StackTraceElement ste : throwable.getStackTrace()) { sb.append(ste.getClassName() + "!" + ste.getMethodName() + "!" + ste.getFileName() + "!" http://git-wip-us.apache.org/repos/asf/cxf/blob/865eb64d/systests/uncategorized/src/test/java/org/apache/cxf/systest/soapfault/details/Soap11ClientServerTest.java ---------------------------------------------------------------------- diff --git a/systests/uncategorized/src/test/java/org/apache/cxf/systest/soapfault/details/Soap11ClientServerTest.java b/systests/uncategorized/src/test/java/org/apache/cxf/systest/soapfault/details/Soap11ClientServerTest.java index a5b2470..b1da372 100644 --- a/systests/uncategorized/src/test/java/org/apache/cxf/systest/soapfault/details/Soap11ClientServerTest.java +++ b/systests/uncategorized/src/test/java/org/apache/cxf/systest/soapfault/details/Soap11ClientServerTest.java @@ -109,7 +109,7 @@ public class Soap11ClientServerTest extends AbstractBusClientServerTestBase { StackTraceElement[] elements = ex.getCause().getStackTrace(); assertEquals("org.apache.cxf.systest.soapfault.details.GreeterImpl11", elements[0].getClassName()); - assertTrue(ex.getCause().getMessage().endsWith("Test \n cause.")); + assertTrue(ex.getCause().getCause().getMessage().endsWith("Test \n cause.")); } http://git-wip-us.apache.org/repos/asf/cxf/blob/865eb64d/systests/uncategorized/src/test/java/org/apache/cxf/systest/soapfault/details/Soap12ClientServerTest.java ---------------------------------------------------------------------- diff --git a/systests/uncategorized/src/test/java/org/apache/cxf/systest/soapfault/details/Soap12ClientServerTest.java b/systests/uncategorized/src/test/java/org/apache/cxf/systest/soapfault/details/Soap12ClientServerTest.java index 83acb5b..b3c50c9 100644 --- a/systests/uncategorized/src/test/java/org/apache/cxf/systest/soapfault/details/Soap12ClientServerTest.java +++ b/systests/uncategorized/src/test/java/org/apache/cxf/systest/soapfault/details/Soap12ClientServerTest.java @@ -73,6 +73,7 @@ public class Soap12ClientServerTest extends AbstractBusClientServerTestBase { assertEquals((short)1, detail.getMinor()); assertEquals("PingMeFault raised by server", ex.getMessage()); StackTraceElement[] element = ex.getStackTrace(); + ex.printStackTrace(); assertEquals("org.apache.cxf.systest.soapfault.details.GreeterImpl12", element[0].getClassName()); } }