1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.ws.soap.server.endpoint;
18
19 import org.springframework.util.Assert;
20 import org.springframework.util.StringUtils;
21 import org.springframework.ws.context.MessageContext;
22 import org.springframework.ws.server.EndpointExceptionResolver;
23 import org.springframework.ws.server.endpoint.AbstractEndpointExceptionResolver;
24 import org.springframework.ws.soap.SoapBody;
25 import org.springframework.ws.soap.SoapFault;
26 import org.springframework.ws.soap.SoapMessage;
27 import org.springframework.ws.soap.soap11.Soap11Body;
28 import org.springframework.ws.soap.soap12.Soap12Body;
29 import org.springframework.ws.soap.soap12.Soap12Fault;
30
31
32
33
34
35
36
37
38
39
40
41 public abstract class AbstractSoapFaultDefinitionExceptionResolver extends AbstractEndpointExceptionResolver {
42
43 private SoapFaultDefinition defaultFault;
44
45
46 public void setDefaultFault(SoapFaultDefinition defaultFault) {
47 this.defaultFault = defaultFault;
48 }
49
50
51
52
53
54
55
56
57 protected abstract SoapFaultDefinition getFaultDefinition(Object endpoint, Exception ex);
58
59 protected final boolean resolveExceptionInternal(MessageContext messageContext, Object endpoint, Exception ex) {
60 Assert.isInstanceOf(SoapMessage.class, messageContext.getResponse(),
61 "AbstractSoapFaultDefinitionExceptionResolver requires a SoapMessage");
62
63 SoapFaultDefinition definition = getFaultDefinition(endpoint, ex);
64 if (definition == null) {
65 definition = defaultFault;
66 }
67 if (definition == null) {
68 return false;
69 }
70
71 String faultStringOrReason = definition.getFaultStringOrReason();
72 if (!StringUtils.hasLength(faultStringOrReason)) {
73 faultStringOrReason = StringUtils.hasLength(ex.getMessage()) ? ex.getMessage() : ex.toString();
74 }
75 SoapBody soapBody = ((SoapMessage) messageContext.getResponse()).getSoapBody();
76 SoapFault fault;
77
78 if (SoapFaultDefinition.SERVER.equals(definition.getFaultCode()) ||
79 SoapFaultDefinition.RECEIVER.equals(definition.getFaultCode())) {
80 fault = soapBody.addServerOrReceiverFault(faultStringOrReason, definition.getLocale());
81 }
82 else if (SoapFaultDefinition.CLIENT.equals(definition.getFaultCode()) ||
83 SoapFaultDefinition.SENDER.equals(definition.getFaultCode())) {
84 fault = soapBody.addClientOrSenderFault(faultStringOrReason, definition.getLocale());
85 }
86 else {
87 if (soapBody instanceof Soap11Body) {
88 Soap11Body soap11Body = (Soap11Body) soapBody;
89 fault = soap11Body.addFault(definition.getFaultCode(), faultStringOrReason, definition.getLocale());
90 }
91 else if (soapBody instanceof Soap12Body) {
92 Soap12Body soap12Body = (Soap12Body) soapBody;
93 Soap12Fault soap12Fault =
94 (Soap12Fault) soap12Body.addServerOrReceiverFault(faultStringOrReason, definition
95 .getLocale());
96 soap12Fault.addFaultSubcode(definition.getFaultCode());
97 fault = soap12Fault;
98 }
99 else {
100 throw new IllegalStateException("This class only supports SOAP 1.1 and SOAP 1.2.");
101 }
102 }
103 if (fault != null) {
104 customizeFault(endpoint, ex, fault);
105 }
106 return true;
107 }
108
109
110
111
112
113
114
115
116
117
118
119 protected void customizeFault(Object endpoint, Exception ex, SoapFault fault) {
120 }
121
122 }