From 6e9137e8603346155f46bd90f5843eca721ccc40 Mon Sep 17 00:00:00 2001 From: Gustavo Martin Morcuende Date: Sat, 19 Dec 2015 22:43:11 +0100 Subject: [PATCH] jaxb2: many improvements about how Spring WS works --- HOWSPRINGWORKS.txt | 138 ++++++++++++++++++ .../src/main/resources/schemas/parent.xsd | 6 + .../webservices/exceptions/BusinessException.java | 22 +++ .../impl/CustomBindingExampleServiceImpl.java | 6 + .../src/main/resources/schemas/examples.xsd | 13 +- .../resources/spring-configuration/ws/soap-ws.xml | 155 +++++++++++++++++---- 6 files changed, 314 insertions(+), 26 deletions(-) create mode 100644 HOWSPRINGWORKS.txt create mode 100644 jaxb2/web-services-spring-jaxb2-server/src/main/java/de/spring/webservices/exceptions/BusinessException.java diff --git a/HOWSPRINGWORKS.txt b/HOWSPRINGWORKS.txt new file mode 100644 index 0000000..42f5276 --- /dev/null +++ b/HOWSPRINGWORKS.txt @@ -0,0 +1,138 @@ + + +*************************** Porque estoy usando sws:annotation-driven *************************** + +Porque estoy usando sws:annotation-driven y no declarando explícitamente los beans en XML existe un +orden de búsqueda de por defecto de macheadores de endpoints y excepciones. Ver: org.springframework.ws.config.AnnotationDrivenBeanDefinitionParser +Cuanto más bajo es el valor de order mayor es la prioridad. + + + 1. Manejadores de excepción, orden por defecto inicializado en AnnotationDrivenBeanDefinitionParser: + a) SoapFaultAnnotationExceptionResolver será el primer manejador de excepciones que se intente usar por defecto. order = 0 + b) SimpleSoapExceptionResolver será el último manejador de excepciones que se intente usar por defecto. order = Ordered.LOWEST_PRECEDENCE + Se usará si la excepción generada no pudo ser manejada por SoapFaultAnnotationExceptionResolver (porque la excepción no fue anotada con + @SoapFault. Este manejador se traga cualquier excepción. + + 2. Endpoints a buscar, orden por defecto inicializado en AnnotationDrivenBeanDefinitionParser: + a) PayloadRootAnnotationMethodEndpointMapping será el primer tipo de endpoints que se buscará y que se intentará usar. order = 0 + Si el XML SOAP que llega no machea ningún metodo anotado con este EndPoint pasamos a b). + b) SoapActionAnnotationMethodEndpointMapping será el segundo tipo de endpoints que se intentará usar. order = 1 + Si el XML SOAP que llega no machea ningún metodo anotado con este EndPoint pasamos a c). + c) AnnotationActionEndpointMapping será el último tipo de endpoints que se buscará. order = 2 + Si el XML SOAP que llega no machea tampoco métodos anotado con este EndPoint se + lanza NoEndpointFoundException desde org.springframework.ws.server.MessageDispatcher.dispatch() + + + EN LUGAR DE USAR LA ANOTACIÓN PODRÍAMOS HABER DECLARADO EXPLÍCITAMENTE CADA BEAN TAL QUE ASÍ: + + + + + + + + + + CON LA ANOTACIÓN ME AHORRO DECLARAR bean POR bean PERO LO MALO ES QUE INSTANCIO MANEJADORES QUE LUEGO NO USO :( + + + + +*************************** org.springframework.ws.server.MessageDispatcher *************************** + + +org.springframework.ws.server.MessageDispatcher ES LA CLASE QUE BUSCA EndPoints Y MANEJADORES DE EXCEPCIÓN + +ORDEN DE BUSQUEDA DE IMPLEMENTACIONES DE MANEJADORES DE EXCEPCION +Busca en el ApplicationContext manejadores de excepción siguiendo este orden. Cuanto más bajo es el valor de order +mayor es la prioridad. + +Por haber usado sws:annotation-driven el orden es el siguiente: + + +1. Primero se busca por excepciones anotadas con @SoapFault. Si la excepcion generada +está anotada son @SoapFault entonces se usa este manejador de excepcion. + +Implementation of the org.springframework.ws.server.EndpointExceptionResolver interface +that uses the SoapFault annotation to map exceptions to SOAP Faults. +org.springframework.ws.soap.server.endpoint.SoapFaultAnnotationExceptionResolver + + + +2. Segundo usa este manejador de excepción. Este manejador machea cualquier excepción así que si +este manejador llega primero siempre resolverá la excepción. +Simple, SOAP-specific EndpointExceptionResolver implementation that stores +the exception's message as the fault string. +org.springframework.ws.soap.server.endpoint.SimpleSoapExceptionResolver + + +3. Un manejador de excepciones inyectado por mi en un archivo XML de Spring. Si no se pone prioridad por defecto +Spring le pone la prioridad más baja que es lo que me pasó a mí al principio y SimpleSoapExceptionResolver +se meterá siempre por el medio :( +org.springframework.ws.soap.server.endpoint.SoapFaultMappingExceptionResolver + + +Si ninguno machea MessageDispatcher lanza la Excepción desde org.springframework.ws.server.MessageDispatcher.processEndpointException() + + + +ORDEN DE BUSQUEDA DE ENDPOINTS EN EL APPLICATION CONTEXT: +Busca en el ApplicationContext metodos anotados siguiendo este orden. Si el XML SOAP que me llega +machea con alguna de estas anotaciones, entonces ese método anotado será usado. Y NO SE CONTINUARÁ +BUSCANDO MÁS MANEJADORES. EN CUANTO UNO MACHEA YA NO SE BUSCA POR MÁS. + + +Por haber usado sws:annotation-driven el orden es el siguiente: + + +1. Primero se busca por métodos de este modo. Si el XML SOAP machea con algún metodo anotado +de este modo, entonces ese método será usado y no se continúa buscando matches. + +Implementation of the org.springframework.ws.server.EndpointMapping interface that uses the +PayloadRoot annotation to map methods to request payload root elements. +org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping +@Endpoint +public class MyEndpoint { + + @PayloadRoot(localPart = "Request", namespace = "http://springframework.org/spring-ws") + public Source doSomethingWithRequest() { + ... + } +} + +2. Segundo se busca por métodos de este modo. Si el XML SOAP machea con algún metodo anotado +de este modo, entonces ese método será usado y no se continúa buscando matches. + +Implementation of the org.springframework.ws.server.EndpointMapping interface that uses the +SoapAction annotation to map methods to the request SOAPAction header. +org.springframework.ws.soap.server.endpoint.mapping.SoapActionAnnotationMethodEndpointMapping +@Endpoint +public class MyEndpoint{ + + @SoapAction("http://springframework.org/spring-ws/SoapAction") + public Source doSomethingWithRequest() { + ... + } +} + + +3. Tercero se busca por métodos de este modo. Si el XML SOAP machea con algún metodo anotado +de este modo, entonces ese método será usado. + +Implementation of the org.springframework.ws.server.EndpointMapping interface that uses the +@Action annotation to map methods to a WS-Addressing Action header. +org.springframework.ws.soap.addressing.server.AnnotationActionEndpointMapping +@Endpoint +@Address("mailto:joe@fabrikam123.example") +public class MyEndpoint{ + + @Action("http://fabrikam123.example/mail/Delete") + public Source doSomethingWithRequest() { + ... + } +} + + +Si ninguno machea MessageDispatcher lanza NoEndpointFoundException desde org.springframework.ws.server.MessageDispatcher.dispatch() diff --git a/jaxb2/web-services-spring-jaxb2-globalxsds/src/main/resources/schemas/parent.xsd b/jaxb2/web-services-spring-jaxb2-globalxsds/src/main/resources/schemas/parent.xsd index 0ce508e..3c340a4 100644 --- a/jaxb2/web-services-spring-jaxb2-globalxsds/src/main/resources/schemas/parent.xsd +++ b/jaxb2/web-services-spring-jaxb2-globalxsds/src/main/resources/schemas/parent.xsd @@ -12,5 +12,11 @@ + + + + + + diff --git a/jaxb2/web-services-spring-jaxb2-server/src/main/java/de/spring/webservices/exceptions/BusinessException.java b/jaxb2/web-services-spring-jaxb2-server/src/main/java/de/spring/webservices/exceptions/BusinessException.java new file mode 100644 index 0000000..f13ae91 --- /dev/null +++ b/jaxb2/web-services-spring-jaxb2-server/src/main/java/de/spring/webservices/exceptions/BusinessException.java @@ -0,0 +1,22 @@ +package de.spring.webservices.exceptions; + +/** + * This exception will be caught by org.springframework.ws.soap.server.endpoint.SoapFaultMappingExceptionResolver + * + */ +public class BusinessException extends RuntimeException { + + private static final long serialVersionUID = -4042139454770293299L; + + public BusinessException() { + super(); + } + + public BusinessException(String message) { + super(message); + } + + public BusinessException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/jaxb2/web-services-spring-jaxb2-server/src/main/java/de/spring/webservices/services/impl/CustomBindingExampleServiceImpl.java b/jaxb2/web-services-spring-jaxb2-server/src/main/java/de/spring/webservices/services/impl/CustomBindingExampleServiceImpl.java index caa7e41..de65baa 100644 --- a/jaxb2/web-services-spring-jaxb2-server/src/main/java/de/spring/webservices/services/impl/CustomBindingExampleServiceImpl.java +++ b/jaxb2/web-services-spring-jaxb2-server/src/main/java/de/spring/webservices/services/impl/CustomBindingExampleServiceImpl.java @@ -2,6 +2,7 @@ package de.spring.webservices.services.impl; import org.springframework.stereotype.Service; +//import de.spring.webservices.exceptions.BusinessException; import de.spring.webservices.auto.CustomBindingExampleRequest; import de.spring.webservices.auto.CustomBindingExampleResponse; import de.spring.webservices.auto.ParentEnumType; @@ -16,6 +17,11 @@ public class CustomBindingExampleServiceImpl implements @Override public CustomBindingExampleResponse requestResponse(final CustomBindingExampleRequest request) { + + // Example about how works org.springframework.ws.soap.server.endpoint.SoapFaultMappingExceptionResolver + // see soap-ws.xml Spring configuration file. +// throw new BusinessException("This feature has not been implemented yet."); + CustomBindingExampleResponse response = new CustomBindingExampleResponse(); response.setData("CUSTOM BINDING SNAKE EYES AND " + request.getData()); diff --git a/jaxb2/web-services-spring-jaxb2-server/src/main/resources/schemas/examples.xsd b/jaxb2/web-services-spring-jaxb2-server/src/main/resources/schemas/examples.xsd index 96c3737..8b4bb95 100644 --- a/jaxb2/web-services-spring-jaxb2-server/src/main/resources/schemas/examples.xsd +++ b/jaxb2/web-services-spring-jaxb2-server/src/main/resources/schemas/examples.xsd @@ -12,10 +12,21 @@ + @@ -26,7 +37,7 @@ - + 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 a59c214..e70b466 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 @@ -14,38 +14,81 @@ http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> - + - - + + + + + + + - - org.springframework.oxm.ValidationFailureException=CLIENT,Invalid request - + + + SERVER + + + -- 2.1.4