I'm building a web service using Spring Boot (1.2.4.RELEASE) and I'm quite new to this framework. Especially, I'm trying to customize the SoapFault content when an exception is thrown (adding a "detail" tag).
I followed this article to do so : http://www.stevideter.com/2009/02/18/of-exceptionresolvers-and-xmlbeans/
Here is my exception:
package foo.bar.exception;
import org.springframework.ws.soap.server.endpoint.annotation.FaultCode;
import org.springframework.ws.soap.server.endpoint.annotation.SoapFault;
@SoapFault(faultCode = FaultCode.SERVER)
public class ServiceException extends Exception {
private static final long serialVersionUID = -1804604596179996724L;
private String tempFaultDetail;
public ServiceException(){
super("ServiceException");
}
public ServiceException(String message) {
super(message);
}
public ServiceException(String message, Throwable cause) {
super(message, cause);
}
public ServiceException(String message, Throwable cause, String fautDetail) {
super(message, cause);
setTempFaultDetail( fautDetail );
}
public String getTempFaultDetail() {
return tempFaultDetail;
}
public void setTempFaultDetail(String tempFaultDetail) {
this.tempFaultDetail = tempFaultDetail;
}
}
Here is my beans.xml (I tried to do it with Java configuration and annotation, but I'm not sure I'm doing it right, so I backed up to XML bean declaration):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="exceptionResolver"
class="foo.bar.ws.DetailSoapFaultDefinitionExceptionResolver">
<property name="defaultFault" value="SERVER" />
<property name="exceptionMappings">
<value>
foo.bar.exception.ServiceException=SERVER,FaultMsg
</value>
</property>
<property name="order" value="1" />
</bean>
</beans>
And the custom class I wrote to override SoapFaultAnnotationExceptionResolver (at first I extended SoapFaultMappingExceptionResolver as presented in the article above) :
package foo.bar.ws;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import org.springframework.ws.soap.SoapFault;
import org.springframework.ws.soap.server.endpoint.SoapFaultAnnotationExceptionResolver;
@Component
public class DetailSoapFaultDefinitionExceptionResolver extends
SoapFaultAnnotationExceptionResolver {
public final static Logger logger = Logger.getLogger( DetailSoapFaultDefinitionExceptionResolver.class );
public DetailSoapFaultDefinitionExceptionResolver() {
super();
// TODO Auto-generated constructor stub
}
@Override
protected void customizeFault(Object endpoint, Exception ex, SoapFault fault) {
logger.debug("TEST OK !");
}
}
But when I throw a ServiceException in my endpoint, the customizeFault method of the custom class is never hit. And for a good reason, the class used as an exception handler is still SoapFaultAnnotationExceptionResolver and not mine...
Does anyone see an explanation ?
Already looked:
As usual, I solve my problem an hour after posting it online. I should have done it earlier !
The bean name/id I tried to override was not right. After scanning a huge amount of org.springframework.beans debug logs, I found that the right bean name is
soapFaultAnnotationExceptionResolver
.I also managed to convert the configuration in Java form:
I know that this response is outdated but maybe it works for someone else.
MessageDispatcher raise two Resolvers by default: SimpleSoapExceptionResolver and SoapFaultAnnotationExceptionResolver in that order, if you want to get a soap fault with custom code and error message, you must declare the correct order to get SoapFaultAnnotationExceptionResolver first, and then SimpleSoapExceptionResolver.
Step 1. On bean configuration file corresponding:
Step 2. Declare your Exceptions as follows:
Step 3.
Raise your Exception in your code normally
throws new DeclaracionNotFoundException(); //With default message from faultStringOrReason or throws new DeclaracionNotFoundException("Ops!!!"); //With other message
It works for me, and I got the following:
I defined faultCode = 4 and faultString=Ops !!!
Regards