diff --git a/core/src/main/java/org/springframework/ws/client/WebServiceClientException.java b/core/src/main/java/org/springframework/ws/client/WebServiceClientException.java
index 0ff193ef..7dcfc7c3 100644
--- a/core/src/main/java/org/springframework/ws/client/WebServiceClientException.java
+++ b/core/src/main/java/org/springframework/ws/client/WebServiceClientException.java
@@ -19,9 +19,11 @@ package org.springframework.ws.client;
import org.springframework.ws.WebServiceException;
/**
+ * Exception thrown whenever an error occurs on the client-side.
+ *
* @author Arjen Poutsma
*/
-public class WebServiceClientException extends WebServiceException {
+public abstract class WebServiceClientException extends WebServiceException {
public WebServiceClientException(String msg) {
super(msg);
diff --git a/core/src/main/java/org/springframework/ws/client/core/WebServiceFaultException.java b/core/src/main/java/org/springframework/ws/client/WebServiceFaultException.java
similarity index 90%
rename from core/src/main/java/org/springframework/ws/client/core/WebServiceFaultException.java
rename to core/src/main/java/org/springframework/ws/client/WebServiceFaultException.java
index d2396446..57e25e18 100644
--- a/core/src/main/java/org/springframework/ws/client/core/WebServiceFaultException.java
+++ b/core/src/main/java/org/springframework/ws/client/WebServiceFaultException.java
@@ -14,9 +14,7 @@
* limitations under the License.
*/
-package org.springframework.ws.client.core;
-
-import org.springframework.ws.client.WebServiceClientException;
+package org.springframework.ws.client;
/**
* Thrown by SimpleFaultResolver when the response message has a fault.
diff --git a/core/src/main/java/org/springframework/ws/client/WebServiceIOException.java b/core/src/main/java/org/springframework/ws/client/WebServiceIOException.java
new file mode 100644
index 00000000..30d534c3
--- /dev/null
+++ b/core/src/main/java/org/springframework/ws/client/WebServiceIOException.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2007 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.ws.client;
+
+import java.io.IOException;
+
+/**
+ * Exception thrown whenever an I/O error occurs on the client-side.
+ *
+ * @author Arjen Poutsma
+ */
+public class WebServiceIOException extends WebServiceClientException {
+
+ public WebServiceIOException(String msg) {
+ super(msg);
+ }
+
+ public WebServiceIOException(String msg, IOException ex) {
+ super(msg, ex);
+ }
+}
diff --git a/core/src/main/java/org/springframework/ws/client/WebServiceTransformerException.java b/core/src/main/java/org/springframework/ws/client/WebServiceTransformerException.java
new file mode 100644
index 00000000..0834a314
--- /dev/null
+++ b/core/src/main/java/org/springframework/ws/client/WebServiceTransformerException.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2007 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.ws.client;
+
+import javax.xml.transform.TransformerException;
+
+/**
+ * Exception thrown whenever an transformation error occurs on the client-side.
+ *
+ * @author Arjen Poutsma
+ */
+public class WebServiceTransformerException extends WebServiceClientException {
+
+ public WebServiceTransformerException(String msg) {
+ super(msg);
+ }
+
+ public WebServiceTransformerException(String msg, TransformerException ex) {
+ super(msg, ex);
+ }
+}
diff --git a/core/src/main/java/org/springframework/ws/client/WebServiceTransportException.java b/core/src/main/java/org/springframework/ws/client/WebServiceTransportException.java
new file mode 100644
index 00000000..51ab3879
--- /dev/null
+++ b/core/src/main/java/org/springframework/ws/client/WebServiceTransportException.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2007 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.ws.client;
+
+import org.springframework.ws.transport.TransportException;
+
+/**
+ * Exception thrown whenever an transport error occurs on the client-side.
+ *
+ * @author Arjen Poutsma
+ */
+public class WebServiceTransportException extends WebServiceIOException {
+
+ public WebServiceTransportException(String msg) {
+ super(msg);
+ }
+
+ public WebServiceTransportException(String msg, TransportException ex) {
+ super(msg, ex);
+ }
+}
diff --git a/core/src/main/java/org/springframework/ws/client/core/SimpleFaultResolver.java b/core/src/main/java/org/springframework/ws/client/core/SimpleFaultResolver.java
index 7d868c58..40cd8dcf 100644
--- a/core/src/main/java/org/springframework/ws/client/core/SimpleFaultResolver.java
+++ b/core/src/main/java/org/springframework/ws/client/core/SimpleFaultResolver.java
@@ -17,18 +17,18 @@
package org.springframework.ws.client.core;
import org.springframework.ws.WebServiceMessage;
+import org.springframework.ws.client.WebServiceFaultException;
/**
- * Simple fault resolver that simply throws a {@link WebServiceFaultException} when a fault occurs.
+ * Simple fault resolver that simply throws a {@link org.springframework.ws.client.WebServiceFaultException} when a
+ * fault occurs.
*
* @author Arjen Poutsma
- * @see WebServiceFaultException
+ * @see org.springframework.ws.client.WebServiceFaultException
*/
public class SimpleFaultResolver implements FaultResolver {
- /**
- * Throws a new WebServiceFaultException.
- */
+ /** Throws a new WebServiceFaultException. */
public void resolveFault(WebServiceMessage message) {
throw new WebServiceFaultException(message.getFaultReason());
}
diff --git a/core/src/main/java/org/springframework/ws/client/core/WebServiceOperations.java b/core/src/main/java/org/springframework/ws/client/core/WebServiceOperations.java
index c95fe83c..17ec68cd 100644
--- a/core/src/main/java/org/springframework/ws/client/core/WebServiceOperations.java
+++ b/core/src/main/java/org/springframework/ws/client/core/WebServiceOperations.java
@@ -16,10 +16,12 @@
package org.springframework.ws.client.core;
-import java.io.IOException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
+import org.springframework.oxm.GenericMarshallingFailureException;
+import org.springframework.ws.client.WebServiceClientException;
+
/**
* Specifies a basic set of Web service operations. Implemented by {@link WebServiceTemplate}. Not often used directly,
* but a useful option to enhance testability, as it can easily be mocked or stubbed.
@@ -35,11 +37,14 @@ public interface WebServiceOperations {
*
* @param requestPayload the object to marshal into the request message payload
* @return the unmarshalled payload of the response message, or null if no response is given
- * @throws IOException in case of I/O errors
+ * @throws GenericMarshallingFailureException
+ * if there is a problem marshalling or unmarshalling
+ * @throws WebServiceClientException if there is a problem sending or receiving the message
* @see WebServiceTemplate#setMarshaller(org.springframework.oxm.Marshaller)
* @see WebServiceTemplate#setUnmarshaller(org.springframework.oxm.Unmarshaller)
*/
- Object marshalSendAndReceive(Object requestPayload) throws IOException;
+ Object marshalSendAndReceive(Object requestPayload)
+ throws GenericMarshallingFailureException, WebServiceClientException;
/**
* Sends a web service message that contains the given payload, marshalled by the configured
@@ -49,11 +54,14 @@ public interface WebServiceOperations {
* @param requestPayload the object to marshal into the request message payload
* @param requestCallback callback to change message, can be null
* @return the unmarshalled payload of the response message, or null if no response is given
- * @throws IOException in case of I/O errors
+ * @throws GenericMarshallingFailureException
+ * if there is a problem marshalling or unmarshalling
+ * @throws WebServiceClientException if there is a problem sending or receiving the message
* @see WebServiceTemplate#setMarshaller(org.springframework.oxm.Marshaller)
* @see WebServiceTemplate#setUnmarshaller(org.springframework.oxm.Unmarshaller)
*/
- Object marshalSendAndReceive(Object requestPayload, WebServiceMessageCallback requestCallback) throws IOException;
+ Object marshalSendAndReceive(Object requestPayload, WebServiceMessageCallback requestCallback)
+ throws GenericMarshallingFailureException, WebServiceClientException;
/**
* Sends a web service message that contains the given payload, reading the result with a
@@ -62,8 +70,9 @@ public interface WebServiceOperations {
* @param requestPayload the payload of the request message
* @param responseExtractor object that will extract results
* @return an arbitrary result object, as returned by the SourceExtractor
+ * @throws WebServiceClientException if there is a problem sending or receiving the message
*/
- Object sendAndReceive(Source requestPayload, SourceExtractor responseExtractor) throws IOException;
+ Object sendAndReceive(Source requestPayload, SourceExtractor responseExtractor) throws WebServiceClientException;
/**
* Sends a web service message that contains the given payload, reading the result with a
@@ -75,10 +84,11 @@ public interface WebServiceOperations {
* @param requestCallback callback to change message, can be null
* @param responseExtractor object that will extract results
* @return an arbitrary result object, as returned by the SourceExtractor
+ * @throws WebServiceClientException if there is a problem sending or receiving the message
*/
Object sendAndReceive(Source requestPayload,
WebServiceMessageCallback requestCallback,
- SourceExtractor responseExtractor) throws IOException;
+ SourceExtractor responseExtractor) throws WebServiceClientException;
/**
* Sends a web service message that contains the given payload. Writes the response, if any, to the given
@@ -86,9 +96,9 @@ public interface WebServiceOperations {
*
* @param requestPayload the payload of the request message
* @param responseResult the result to write the response payload to
- * @throws IOException in case of I/O errors
+ * @throws WebServiceClientException if there is a problem sending or receiving the message
*/
- void sendAndReceive(Source requestPayload, Result responseResult) throws IOException;
+ void sendAndReceive(Source requestPayload, Result responseResult) throws WebServiceClientException;
/**
* Sends a web service message that contains the given payload. Writes the response, if any, to the given
@@ -99,10 +109,10 @@ public interface WebServiceOperations {
* @param requestPayload the payload of the request message
* @param requestCallback callback to change message, can be null
* @param responseResult the result to write the response payload to
- * @throws IOException in case of I/O errors
+ * @throws WebServiceClientException if there is a problem sending or receiving the message
*/
void sendAndReceive(Source requestPayload, WebServiceMessageCallback requestCallback, Result responseResult)
- throws IOException;
+ throws WebServiceClientException;
/**
* Sends a web service message that can be manipulated with the given callback, reading the result with a
@@ -111,10 +121,10 @@ public interface WebServiceOperations {
* @param requestCallback the requestCallback to be used for manipulating the request message
* @param responseExtractor object that will extract results
* @return an arbitrary result object, as returned by the WebServiceMessageExtractor
- * @throws IOException in case of I/O errors
+ * @throws WebServiceClientException if there is a problem sending or receiving the message
*/
Object sendAndReceive(WebServiceMessageCallback requestCallback, WebServiceMessageExtractor responseExtractor)
- throws IOException;
+ throws WebServiceClientException;
/**
* Sends a web service message that can be manipulated with the given callback, reading the result with a
@@ -122,8 +132,8 @@ public interface WebServiceOperations {
*
* @param requestCallback the callback to be used for manipulating the request message
* @param responseCallback the callback to be used for manipulating the response message
- * @throws IOException in case of I/O errors
+ * @throws WebServiceClientException if there is a problem sending or receiving the message
*/
void sendAndReceive(WebServiceMessageCallback requestCallback, WebServiceMessageCallback responseCallback)
- throws IOException;
+ throws WebServiceClientException;
}
diff --git a/core/src/main/java/org/springframework/ws/client/core/WebServiceTemplate.java b/core/src/main/java/org/springframework/ws/client/core/WebServiceTemplate.java
index 1ee54529..cf38ef11 100644
--- a/core/src/main/java/org/springframework/ws/client/core/WebServiceTemplate.java
+++ b/core/src/main/java/org/springframework/ws/client/core/WebServiceTemplate.java
@@ -36,10 +36,13 @@ import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.ws.WebServiceMessage;
import org.springframework.ws.WebServiceMessageFactory;
-import org.springframework.ws.client.WebServiceClientException;
+import org.springframework.ws.client.WebServiceIOException;
+import org.springframework.ws.client.WebServiceTransformerException;
+import org.springframework.ws.client.WebServiceTransportException;
import org.springframework.ws.client.support.WebServiceAccessor;
import org.springframework.ws.context.MessageContext;
import org.springframework.ws.transport.FaultAwareWebServiceConnection;
+import org.springframework.ws.transport.TransportException;
import org.springframework.ws.transport.TransportInputStream;
import org.springframework.ws.transport.TransportOutputStream;
import org.springframework.ws.transport.WebServiceConnection;
@@ -144,12 +147,11 @@ public class WebServiceTemplate extends WebServiceAccessor implements WebService
* Marshalling methods
*/
- public Object marshalSendAndReceive(final Object requestPayload) throws IOException {
+ public Object marshalSendAndReceive(final Object requestPayload) {
return marshalSendAndReceive(requestPayload, null);
}
- public Object marshalSendAndReceive(final Object requestPayload, final WebServiceMessageCallback requestCallback)
- throws IOException {
+ public Object marshalSendAndReceive(final Object requestPayload, final WebServiceMessageCallback requestCallback) {
if (getMarshaller() == null) {
throw new IllegalStateException("No marshaller registered. Check configuration of WebServiceTemplate.");
}
@@ -176,13 +178,13 @@ public class WebServiceTemplate extends WebServiceAccessor implements WebService
* Result-handling methods
*/
- public void sendAndReceive(Source requestPayload, Result responseResult) throws IOException {
+ public void sendAndReceive(Source requestPayload, Result responseResult) {
sendAndReceive(requestPayload, null, responseResult);
}
public void sendAndReceive(Source requestPayload,
WebServiceMessageCallback requestCallback,
- final Result responseResult) throws IOException {
+ final Result responseResult) {
try {
final Transformer transformer = createTransformer();
doSendAndReceive(transformer, requestPayload, requestCallback, new SourceExtractor() {
@@ -192,14 +194,14 @@ public class WebServiceTemplate extends WebServiceAccessor implements WebService
transformer.transform(source, responseResult);
}
catch (TransformerException ex) {
- throw new WebServiceClientException("Could not transform payload", ex);
+ throw new WebServiceTransformerException("Could not transform payload", ex);
}
return null;
}
});
}
- catch (TransformerException ex) {
- throw new WebServiceClientException("Could not create transformer", ex);
+ catch (TransformerConfigurationException ex) {
+ throw new WebServiceTransformerException("Could not create transformer", ex);
}
}
@@ -207,27 +209,26 @@ public class WebServiceTemplate extends WebServiceAccessor implements WebService
* Source-handling methods
*/
- public Object sendAndReceive(final Source requestPayload, final SourceExtractor responseExtractor)
- throws IOException {
+ public Object sendAndReceive(final Source requestPayload, final SourceExtractor responseExtractor) {
return sendAndReceive(requestPayload, null, responseExtractor);
}
public Object sendAndReceive(final Source requestPayload,
final WebServiceMessageCallback requestCallback,
- final SourceExtractor responseExtractor) throws IOException {
+ final SourceExtractor responseExtractor) {
try {
return doSendAndReceive(createTransformer(), requestPayload, requestCallback, responseExtractor);
}
catch (TransformerConfigurationException ex) {
- throw new WebServiceClientException("Could not create transformer", ex);
+ throw new WebServiceTransformerException("Could not create transformer", ex);
}
}
private Object doSendAndReceive(final Transformer transformer,
final Source requestPayload,
final WebServiceMessageCallback requestCallback,
- final SourceExtractor responseExtractor) throws IOException {
+ final SourceExtractor responseExtractor) {
Assert.notNull(responseExtractor, "responseExtractor must not be null");
return sendAndReceive(new WebServiceMessageCallback() {
public void doInMessage(WebServiceMessage message) throws IOException {
@@ -238,7 +239,7 @@ public class WebServiceTemplate extends WebServiceAccessor implements WebService
}
}
catch (TransformerException ex) {
- throw new WebServiceClientException("Could not transform payload to request message", ex);
+ throw new WebServiceTransformerException("Could not transform payload to request message", ex);
}
}
}, new SourceExtractorMessageExtractor(responseExtractor));
@@ -248,18 +249,18 @@ public class WebServiceTemplate extends WebServiceAccessor implements WebService
* WebServiceMessage-handling methods
*/
- public void sendAndReceive(WebServiceMessageCallback requestCallback, WebServiceMessageCallback responseCallback)
- throws IOException {
+ public void sendAndReceive(WebServiceMessageCallback requestCallback, WebServiceMessageCallback responseCallback) {
Assert.notNull(responseCallback, "responseCallback must not be null");
sendAndReceive(requestCallback, new WebServiceMessageCallbackMessageExtractor(responseCallback));
}
public Object sendAndReceive(WebServiceMessageCallback requestCallback,
- WebServiceMessageExtractor responseExtractor) throws IOException {
+ WebServiceMessageExtractor responseExtractor) {
Assert.notNull(responseExtractor, "response extractor must not be null");
MessageContext messageContext = createMessageContext();
- WebServiceConnection connection = getMessageSender().createConnection();
+ WebServiceConnection connection = null;
try {
+ connection = getMessageSender().createConnection();
WebServiceMessage request = messageContext.getRequest();
if (requestCallback != null) {
requestCallback.doInMessage(request);
@@ -287,8 +288,21 @@ public class WebServiceTemplate extends WebServiceAccessor implements WebService
}
return null;
}
+ catch (TransportException ex) {
+ throw new WebServiceTransportException("Could not use transport: " + ex.getMessage(), ex);
+ }
+ catch (IOException ex) {
+ throw new WebServiceIOException("I/O error: " + ex.getMessage(), ex);
+ }
finally {
- connection.close();
+ if (connection != null) {
+ try {
+ connection.close();
+ }
+ catch (IOException ex) {
+ logger.debug("Could not close WebServiceConnection", ex);
+ }
+ }
}
}
diff --git a/core/src/test/java/org/springframework/ws/client/core/SimpleFaultResolverTest.java b/core/src/test/java/org/springframework/ws/client/core/SimpleFaultResolverTest.java
index 0013835d..72fb4c31 100644
--- a/core/src/test/java/org/springframework/ws/client/core/SimpleFaultResolverTest.java
+++ b/core/src/test/java/org/springframework/ws/client/core/SimpleFaultResolverTest.java
@@ -19,6 +19,7 @@ package org.springframework.ws.client.core;
import junit.framework.TestCase;
import org.easymock.MockControl;
import org.springframework.ws.WebServiceMessage;
+import org.springframework.ws.client.WebServiceFaultException;
public class SimpleFaultResolverTest extends TestCase {
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index d7723e3b..e9c21107 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -6,6 +6,9 @@