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 java.util.Locale;
20 import javax.xml.namespace.QName;
21 import javax.xml.soap.MessageFactory;
22 import javax.xml.soap.SOAPConstants;
23 import javax.xml.soap.SOAPMessage;
24
25 import org.springframework.ws.context.DefaultMessageContext;
26 import org.springframework.ws.context.MessageContext;
27 import org.springframework.ws.soap.SoapMessage;
28 import org.springframework.ws.soap.SoapMessageFactory;
29 import org.springframework.ws.soap.SoapVersion;
30 import org.springframework.ws.soap.saaj.SaajSoapMessage;
31 import org.springframework.ws.soap.saaj.SaajSoapMessageFactory;
32 import org.springframework.ws.soap.server.endpoint.annotation.FaultCode;
33 import org.springframework.ws.soap.server.endpoint.annotation.SoapFault;
34 import org.springframework.ws.soap.soap11.Soap11Fault;
35 import org.springframework.ws.soap.soap12.Soap12Fault;
36
37 import org.junit.Assert;
38 import org.junit.Before;
39 import org.junit.Test;
40
41 public class SoapFaultAnnotationExceptionResolverTest {
42
43 private SoapFaultAnnotationExceptionResolver resolver;
44
45 @Before
46 public void setUp() throws Exception {
47 resolver = new SoapFaultAnnotationExceptionResolver();
48 }
49
50 @Test
51 public void testResolveExceptionClientSoap11() throws Exception {
52 MessageFactory saajFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
53 SoapMessageFactory factory = new SaajSoapMessageFactory(saajFactory);
54 MessageContext context = new DefaultMessageContext(factory);
55
56 boolean result = resolver.resolveException(context, null, new MyClientException());
57 Assert.assertTrue("resolveException returns false", result);
58 Assert.assertTrue("Context has no response", context.hasResponse());
59 SoapMessage response = (SoapMessage) context.getResponse();
60 Assert.assertTrue("Resonse has no fault", response.getSoapBody().hasFault());
61 Soap11Fault fault = (Soap11Fault) response.getSoapBody().getFault();
62 Assert.assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getClientOrSenderFaultName(),
63 fault.getFaultCode());
64 Assert.assertEquals("Invalid fault string on fault", "Client error", fault.getFaultStringOrReason());
65 Assert.assertNull("Detail on fault", fault.getFaultDetail());
66 }
67
68 @Test
69 public void testResolveExceptionSenderSoap12() throws Exception {
70 MessageFactory saajFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
71 SoapMessageFactory factory = new SaajSoapMessageFactory(saajFactory);
72 MessageContext context = new DefaultMessageContext(factory);
73
74 boolean result = resolver.resolveException(context, null, new MySenderException());
75 Assert.assertTrue("resolveException returns false", result);
76 Assert.assertTrue("Context has no response", context.hasResponse());
77 SoapMessage response = (SoapMessage) context.getResponse();
78 Assert.assertTrue("Resonse has no fault", response.getSoapBody().hasFault());
79 Soap12Fault fault = (Soap12Fault) response.getSoapBody().getFault();
80 Assert.assertEquals("Invalid fault code on fault", SoapVersion.SOAP_12.getClientOrSenderFaultName(),
81 fault.getFaultCode());
82 Assert.assertEquals("Invalid fault string on fault", "Sender error", fault.getFaultReasonText(Locale.ENGLISH));
83 Assert.assertNull("Detail on fault", fault.getFaultDetail());
84 }
85
86 @Test
87 public void testResolveExceptionServerSoap11() throws Exception {
88 MessageFactory saajFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
89 SoapMessageFactory factory = new SaajSoapMessageFactory(saajFactory);
90 MessageContext context = new DefaultMessageContext(factory);
91
92 boolean result = resolver.resolveException(context, null, new MyServerException());
93 Assert.assertTrue("resolveException returns false", result);
94 Assert.assertTrue("Context has no response", context.hasResponse());
95 SoapMessage response = (SoapMessage) context.getResponse();
96 Assert.assertTrue("Resonse has no fault", response.getSoapBody().hasFault());
97 Soap11Fault fault = (Soap11Fault) response.getSoapBody().getFault();
98 Assert.assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getServerOrReceiverFaultName(),
99 fault.getFaultCode());
100 Assert.assertEquals("Invalid fault string on fault", "Server error", fault.getFaultStringOrReason());
101 Assert.assertNull("Detail on fault", fault.getFaultDetail());
102 }
103
104 @Test
105 public void testResolveExceptionReceiverSoap12() throws Exception {
106 MessageFactory saajFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
107 SOAPMessage message = saajFactory.createMessage();
108 SoapMessageFactory factory = new SaajSoapMessageFactory(saajFactory);
109 MessageContext context = new DefaultMessageContext(new SaajSoapMessage(message), factory);
110
111 boolean result = resolver.resolveException(context, null, new MyReceiverException());
112 Assert.assertTrue("resolveException returns false", result);
113 Assert.assertTrue("Context has no response", context.hasResponse());
114 SoapMessage response = (SoapMessage) context.getResponse();
115 Assert.assertTrue("Resonse has no fault", response.getSoapBody().hasFault());
116 Soap12Fault fault = (Soap12Fault) response.getSoapBody().getFault();
117 Assert.assertEquals("Invalid fault code on fault", SoapVersion.SOAP_12.getServerOrReceiverFaultName(),
118 fault.getFaultCode());
119 Assert.assertEquals("Invalid fault string on fault", "Receiver error", fault.getFaultReasonText(Locale.ENGLISH));
120 Assert.assertNull("Detail on fault", fault.getFaultDetail());
121 }
122
123 @Test
124 public void testResolveExceptionDefault() throws Exception {
125 SoapFaultDefinition defaultFault = new SoapFaultDefinition();
126 defaultFault.setFaultCode(SoapFaultDefinition.CLIENT);
127 defaultFault.setFaultStringOrReason("faultstring");
128 resolver.setDefaultFault(defaultFault);
129 MessageFactory saajFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
130 SoapMessageFactory factory = new SaajSoapMessageFactory(saajFactory);
131 MessageContext context = new DefaultMessageContext(factory);
132
133 boolean result = resolver.resolveException(context, null, new NonAnnotatedException());
134 Assert.assertTrue("resolveException returns false", result);
135 Assert.assertTrue("Context has no response", context.hasResponse());
136 SoapMessage response = (SoapMessage) context.getResponse();
137 Assert.assertTrue("Resonse has no fault", response.getSoapBody().hasFault());
138 Soap11Fault fault = (Soap11Fault) response.getSoapBody().getFault();
139 Assert.assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getClientOrSenderFaultName(),
140 fault.getFaultCode());
141 Assert.assertEquals("Invalid fault string on fault", "faultstring", fault.getFaultStringOrReason());
142 Assert.assertNull("Detail on fault", fault.getFaultDetail());
143 }
144
145 @Test
146 public void testResolveExceptionCustom() throws Exception {
147 MessageFactory saajFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
148 SoapMessageFactory factory = new SaajSoapMessageFactory(saajFactory);
149 MessageContext context = new DefaultMessageContext(factory);
150
151 boolean result = resolver.resolveException(context, null, new MyCustomException());
152 Assert.assertTrue("resolveException returns false", result);
153 Assert.assertTrue("Context has no response", context.hasResponse());
154 SoapMessage response = (SoapMessage) context.getResponse();
155 Assert.assertTrue("Resonse has no fault", response.getSoapBody().hasFault());
156 Soap11Fault fault = (Soap11Fault) response.getSoapBody().getFault();
157 Assert.assertEquals("Invalid fault code on fault", new QName("http://springframework.org/spring-ws", "Fault"),
158 fault.getFaultCode());
159 Assert.assertEquals("Invalid fault string on fault", "MyCustomException thrown", fault.getFaultStringOrReason());
160 Assert.assertEquals("Invalid fault locale on fault", new Locale("nl"), fault.getFaultStringLocale());
161 }
162
163 @Test
164 public void testResolveExceptionInheritance() throws Exception {
165 MessageFactory saajFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
166 SoapMessageFactory factory = new SaajSoapMessageFactory(saajFactory);
167 MessageContext context = new DefaultMessageContext(factory);
168
169 boolean result = resolver.resolveException(context, null, new MySubClientException());
170 Assert.assertTrue("resolveException returns false", result);
171 Assert.assertTrue("Context has no response", context.hasResponse());
172 SoapMessage response = (SoapMessage) context.getResponse();
173 Assert.assertTrue("Resonse has no fault", response.getSoapBody().hasFault());
174 Soap11Fault fault = (Soap11Fault) response.getSoapBody().getFault();
175 Assert.assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getClientOrSenderFaultName(),
176 fault.getFaultCode());
177 Assert.assertEquals("Invalid fault string on fault", "Client error", fault.getFaultStringOrReason());
178 Assert.assertNull("Detail on fault", fault.getFaultDetail());
179 }
180
181 @Test
182 public void testResolveExceptionExceptionMessage() throws Exception {
183 MessageFactory saajFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
184 SoapMessageFactory factory = new SaajSoapMessageFactory(saajFactory);
185 MessageContext context = new DefaultMessageContext(factory);
186
187 boolean result = resolver.resolveException(context, null, new NoStringOrReasonException("Exception message"));
188 Assert.assertTrue("resolveException returns false", result);
189 Assert.assertTrue("Context has no response", context.hasResponse());
190 SoapMessage response = (SoapMessage) context.getResponse();
191 Assert.assertTrue("Resonse has no fault", response.getSoapBody().hasFault());
192 Soap11Fault fault = (Soap11Fault) response.getSoapBody().getFault();
193 Assert.assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getClientOrSenderFaultName(),
194 fault.getFaultCode());
195 Assert.assertEquals("Invalid fault string on fault", "Exception message", fault.getFaultStringOrReason());
196 Assert.assertNull("Detail on fault", fault.getFaultDetail());
197 }
198
199 @SoapFault(faultCode = FaultCode.CLIENT, faultStringOrReason = "Client error")
200 public class MyClientException extends Exception {
201
202 }
203
204 public class MySubClientException extends MyClientException {
205
206 }
207
208 @SoapFault(faultCode = FaultCode.CLIENT)
209 public class NoStringOrReasonException extends Exception {
210
211 public NoStringOrReasonException(String message) {
212 super(message);
213 }
214 }
215
216 @SoapFault(faultCode = FaultCode.SENDER, faultStringOrReason = "Sender error")
217 public class MySenderException extends Exception {
218
219 }
220
221 @SoapFault(faultCode = FaultCode.SERVER, faultStringOrReason = "Server error")
222 public class MyServerException extends Exception {
223
224 }
225
226 @SoapFault(faultCode = FaultCode.RECEIVER, faultStringOrReason = "Receiver error")
227 public class MyReceiverException extends Exception {
228
229 }
230
231 @SoapFault(faultCode = FaultCode.CUSTOM, customFaultCode = "{http://springframework.org/spring-ws}Fault",
232 faultStringOrReason = "MyCustomException thrown", locale = "nl")
233 public class MyCustomException extends Exception {
234
235 }
236
237 public class NonAnnotatedException extends Exception {
238
239 }
240
241
242 }