From 4ba5acb72ebc24cc2100766cad088308dd64f4d5 Mon Sep 17 00:00:00 2001 From: Gustavo Martin Morcuende Date: Sun, 20 Dec 2015 19:25:22 +0100 Subject: [PATCH] jaxb2: schemas in PayloadValidatingInterceptor, ORDER MATTERS!!!! --- .../endpoints/MyCustomExceptionResolver.java | 131 --------------------- .../MyCustomMappingExceptionResolver.java | 131 +++++++++++++++++++++ .../resources/spring-configuration/ws/soap-ws.xml | 28 ++++- 3 files changed, 155 insertions(+), 135 deletions(-) delete mode 100644 jaxb2/web-services-spring-jaxb2-server/src/main/java/de/spring/webservices/endpoints/MyCustomExceptionResolver.java create mode 100644 jaxb2/web-services-spring-jaxb2-server/src/main/java/de/spring/webservices/endpoints/MyCustomMappingExceptionResolver.java diff --git a/jaxb2/web-services-spring-jaxb2-server/src/main/java/de/spring/webservices/endpoints/MyCustomExceptionResolver.java b/jaxb2/web-services-spring-jaxb2-server/src/main/java/de/spring/webservices/endpoints/MyCustomExceptionResolver.java deleted file mode 100644 index f2a375f..0000000 --- a/jaxb2/web-services-spring-jaxb2-server/src/main/java/de/spring/webservices/endpoints/MyCustomExceptionResolver.java +++ /dev/null @@ -1,131 +0,0 @@ -package de.spring.webservices.endpoints; - -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; - -import javax.xml.transform.Result; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.oxm.Marshaller; -import org.springframework.util.CollectionUtils; -import org.springframework.ws.soap.SoapFault; -import org.springframework.ws.soap.SoapFaultDetail; -import org.springframework.ws.soap.server.endpoint.AbstractSoapFaultDefinitionExceptionResolver; -import org.springframework.ws.soap.server.endpoint.SoapFaultDefinition; -import org.springframework.ws.soap.server.endpoint.SoapFaultDefinitionEditor; - -import de.spring.webservices.auto.Element; -import de.spring.webservices.auto.ExampleFault; -import de.spring.webservices.exceptions.CustomBusinessException; - -public class MyCustomExceptionResolver extends AbstractSoapFaultDefinitionExceptionResolver { - private static final Logger LOGGER = LoggerFactory.getLogger(MyCustomExceptionResolver.class); - - private Marshaller marshaller; - - private Map exceptionMappings = new LinkedHashMap<>(); - - /** - * Set the mappings between exception class names and SOAP Faults. The exception class name can be a substring, with - * no wildcard support at present. - * - *

The values of the given properties object should use the format described in - * {@code SoapFaultDefinitionEditor}. - * - *

Follows the same matching algorithm as {@code SimpleMappingExceptionResolver}. - * - * @param mappings exception patterns (can also be fully qualified class names) as keys, fault definition texts as - * values - * @see SoapFaultDefinitionEditor - */ - public void setExceptionMappings(Properties mappings) { - for (Map.Entry entry : mappings.entrySet()) { - if (entry.getKey() instanceof String && entry.getValue() instanceof String) { - exceptionMappings.put((String)entry.getKey(), (String)entry.getValue()); - } - } - } - - @Override - protected SoapFaultDefinition getFaultDefinition(Object endpoint, Exception ex) { - if (!CollectionUtils.isEmpty(exceptionMappings)) { - String definitionText = null; - int deepest = Integer.MAX_VALUE; - for (String exceptionMapping : exceptionMappings.keySet()) { - int depth = getDepth(exceptionMapping, ex); - if (depth >= 0 && depth < deepest) { - deepest = depth; - definitionText = exceptionMappings.get(exceptionMapping); - } - } - if (definitionText != null) { - SoapFaultDefinitionEditor editor = new SoapFaultDefinitionEditor(); - editor.setAsText(definitionText); - return (SoapFaultDefinition) editor.getValue(); - } - } - return null; - } - - /** - * Return the depth to the superclass matching. {@code 0} means ex matches exactly. Returns {@code -1} if - * there's no match. Otherwise, returns depth. Lowest depth wins. - * - *

Follows the same algorithm as RollbackRuleAttribute, and SimpleMappingExceptionResolver - */ - protected int getDepth(String exceptionMapping, Exception ex) { - return getDepth(exceptionMapping, ex.getClass(), 0); - } - - @SuppressWarnings("unchecked") - private int getDepth(String exceptionMapping, Class exceptionClass, int depth) { - if (exceptionClass.getName().indexOf(exceptionMapping) != -1) { - return depth; - } - if (exceptionClass.equals(Throwable.class)) { - return -1; - } - return getDepth(exceptionMapping, (Class) exceptionClass.getSuperclass(), depth + 1); - } - - protected void customizeFault(Object endpoint, Exception ex, SoapFault fault) { - SoapFaultDetail detail = fault.addFaultDetail(); - Result result = detail.getResult(); - - Element element = new Element(); - element.setMessage(ex.getMessage()); - - if (ex instanceof CustomBusinessException) { - List arguments = element.getMessageArgs(); - arguments.add("ARGUMENT 1"); - arguments.add("ARGUMENT 2"); - } - - ExampleFault customFault = new ExampleFault(); - customFault.setTechnicalError(getStackTrace(ex)); - List elements = customFault.getElements(); - elements.add(element); - - try { - marshaller.marshal(customFault, result); - } catch (Exception marshallEx) { - LOGGER.error("", marshallEx); - } - } - - public void setMarshaller(Marshaller marshaller) { - this.marshaller = marshaller; - } - - private static String getStackTrace(final Throwable throwable) { - final StringWriter sw = new StringWriter(); - final PrintWriter pw = new PrintWriter(sw, true); - throwable.printStackTrace(pw); - return sw.getBuffer().toString(); - } -} diff --git a/jaxb2/web-services-spring-jaxb2-server/src/main/java/de/spring/webservices/endpoints/MyCustomMappingExceptionResolver.java b/jaxb2/web-services-spring-jaxb2-server/src/main/java/de/spring/webservices/endpoints/MyCustomMappingExceptionResolver.java new file mode 100644 index 0000000..f2a375f --- /dev/null +++ b/jaxb2/web-services-spring-jaxb2-server/src/main/java/de/spring/webservices/endpoints/MyCustomMappingExceptionResolver.java @@ -0,0 +1,131 @@ +package de.spring.webservices.endpoints; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import javax.xml.transform.Result; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.oxm.Marshaller; +import org.springframework.util.CollectionUtils; +import org.springframework.ws.soap.SoapFault; +import org.springframework.ws.soap.SoapFaultDetail; +import org.springframework.ws.soap.server.endpoint.AbstractSoapFaultDefinitionExceptionResolver; +import org.springframework.ws.soap.server.endpoint.SoapFaultDefinition; +import org.springframework.ws.soap.server.endpoint.SoapFaultDefinitionEditor; + +import de.spring.webservices.auto.Element; +import de.spring.webservices.auto.ExampleFault; +import de.spring.webservices.exceptions.CustomBusinessException; + +public class MyCustomExceptionResolver extends AbstractSoapFaultDefinitionExceptionResolver { + private static final Logger LOGGER = LoggerFactory.getLogger(MyCustomExceptionResolver.class); + + private Marshaller marshaller; + + private Map exceptionMappings = new LinkedHashMap<>(); + + /** + * Set the mappings between exception class names and SOAP Faults. The exception class name can be a substring, with + * no wildcard support at present. + * + *

The values of the given properties object should use the format described in + * {@code SoapFaultDefinitionEditor}. + * + *

Follows the same matching algorithm as {@code SimpleMappingExceptionResolver}. + * + * @param mappings exception patterns (can also be fully qualified class names) as keys, fault definition texts as + * values + * @see SoapFaultDefinitionEditor + */ + public void setExceptionMappings(Properties mappings) { + for (Map.Entry entry : mappings.entrySet()) { + if (entry.getKey() instanceof String && entry.getValue() instanceof String) { + exceptionMappings.put((String)entry.getKey(), (String)entry.getValue()); + } + } + } + + @Override + protected SoapFaultDefinition getFaultDefinition(Object endpoint, Exception ex) { + if (!CollectionUtils.isEmpty(exceptionMappings)) { + String definitionText = null; + int deepest = Integer.MAX_VALUE; + for (String exceptionMapping : exceptionMappings.keySet()) { + int depth = getDepth(exceptionMapping, ex); + if (depth >= 0 && depth < deepest) { + deepest = depth; + definitionText = exceptionMappings.get(exceptionMapping); + } + } + if (definitionText != null) { + SoapFaultDefinitionEditor editor = new SoapFaultDefinitionEditor(); + editor.setAsText(definitionText); + return (SoapFaultDefinition) editor.getValue(); + } + } + return null; + } + + /** + * Return the depth to the superclass matching. {@code 0} means ex matches exactly. Returns {@code -1} if + * there's no match. Otherwise, returns depth. Lowest depth wins. + * + *

Follows the same algorithm as RollbackRuleAttribute, and SimpleMappingExceptionResolver + */ + protected int getDepth(String exceptionMapping, Exception ex) { + return getDepth(exceptionMapping, ex.getClass(), 0); + } + + @SuppressWarnings("unchecked") + private int getDepth(String exceptionMapping, Class exceptionClass, int depth) { + if (exceptionClass.getName().indexOf(exceptionMapping) != -1) { + return depth; + } + if (exceptionClass.equals(Throwable.class)) { + return -1; + } + return getDepth(exceptionMapping, (Class) exceptionClass.getSuperclass(), depth + 1); + } + + protected void customizeFault(Object endpoint, Exception ex, SoapFault fault) { + SoapFaultDetail detail = fault.addFaultDetail(); + Result result = detail.getResult(); + + Element element = new Element(); + element.setMessage(ex.getMessage()); + + if (ex instanceof CustomBusinessException) { + List arguments = element.getMessageArgs(); + arguments.add("ARGUMENT 1"); + arguments.add("ARGUMENT 2"); + } + + ExampleFault customFault = new ExampleFault(); + customFault.setTechnicalError(getStackTrace(ex)); + List elements = customFault.getElements(); + elements.add(element); + + try { + marshaller.marshal(customFault, result); + } catch (Exception marshallEx) { + LOGGER.error("", marshallEx); + } + } + + public void setMarshaller(Marshaller marshaller) { + this.marshaller = marshaller; + } + + private static String getStackTrace(final Throwable throwable) { + final StringWriter sw = new StringWriter(); + final PrintWriter pw = new PrintWriter(sw, true); + throwable.printStackTrace(pw); + return sw.getBuffer().toString(); + } +} diff --git a/jaxb2/web-services-spring-jaxb2-server/src/main/resources/spring-configuration/ws/soap-ws.xml b/jaxb2/web-services-spring-jaxb2-server/src/main/resources/spring-configuration/ws/soap-ws.xml index 243e56d..dc7d6f5 100644 --- a/jaxb2/web-services-spring-jaxb2-server/src/main/resources/spring-configuration/ws/soap-ws.xml +++ b/jaxb2/web-services-spring-jaxb2-server/src/main/resources/spring-configuration/ws/soap-ws.xml @@ -98,7 +98,7 @@ + targetNamespace="http://gumartinm.name/spring-ws/exampleService"> @@ -142,8 +142,19 @@ class="org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor"> - classpath:schemas/examples.xsd + classpath:schemas/parent.xsd + + classpath:schemas/examples.xsd @@ -164,7 +175,7 @@ class="org.springframework.ws.soap.server.endpoint.SoapFaultMappingExceptionResolver"> + -- 2.1.4