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 @Override
60 protected final boolean resolveExceptionInternal(MessageContext messageContext, Object endpoint, Exception ex) {
61 Assert.isInstanceOf(SoapMessage.class, messageContext.getResponse(),
62 "AbstractSoapFaultDefinitionExceptionResolver requires a SoapMessage");
63
64 SoapFaultDefinition definition = getFaultDefinition(endpoint, ex);
65 if (definition == null) {
66 definition = defaultFault;
67 }
68 if (definition == null) {
69 return false;
70 }
71
72 String faultStringOrReason = definition.getFaultStringOrReason();
73 if (!StringUtils.hasLength(faultStringOrReason)) {
74 faultStringOrReason = StringUtils.hasLength(ex.getMessage()) ? ex.getMessage() : ex.toString();
75 }
76 SoapBody soapBody = ((SoapMessage) messageContext.getResponse()).getSoapBody();
77 SoapFault fault;
78
79 if (SoapFaultDefinition.SERVER.equals(definition.getFaultCode()) ||
80 SoapFaultDefinition.RECEIVER.equals(definition.getFaultCode())) {
81 fault = soapBody.addServerOrReceiverFault(faultStringOrReason, definition.getLocale());
82 }
83 else if (SoapFaultDefinition.CLIENT.equals(definition.getFaultCode()) ||
84 SoapFaultDefinition.SENDER.equals(definition.getFaultCode())) {
85 fault = soapBody.addClientOrSenderFault(faultStringOrReason, definition.getLocale());
86 }
87 else {
88 if (soapBody instanceof Soap11Body) {
89 Soap11Body soap11Body = (Soap11Body) soapBody;
90 fault = soap11Body.addFault(definition.getFaultCode(), faultStringOrReason, definition.getLocale());
91 }
92 else if (soapBody instanceof Soap12Body) {
93 Soap12Body soap12Body = (Soap12Body) soapBody;
94 Soap12Fault soap12Fault =
95 (Soap12Fault) soap12Body.addServerOrReceiverFault(faultStringOrReason, definition
96 .getLocale());
97 soap12Fault.addFaultSubcode(definition.getFaultCode());
98 fault = soap12Fault;
99 }
100 else {
101 throw new IllegalStateException("This class only supports SOAP 1.1 and SOAP 1.2.");
102 }
103 }
104 if (fault != null) {
105 customizeFault(endpoint, ex, fault);
106 }
107 return true;
108 }
109
110
111
112
113
114
115
116
117
118
119
120 protected void customizeFault(Object endpoint, Exception ex, SoapFault fault) {
121 }
122
123 }