在WS-SoapFault中添加详细信息:未使用我的自定义ExceptionResolver



我正在使用Spring Boot(1.2.4.RELEASE)构建一个web服务,我对这个框架还很陌生。特别是,当抛出异常时,我正在尝试自定义SoapFault内容(添加一个"detail"标记)。

我遵循了这篇文章:http://www.stevideter.com/2009/02/18/of-exceptionresolvers-and-xmlbeans/

这是我的例外:

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;
    }       
}

这是我的beans.xml(我试着用Java配置和注释来做,但我不确定我做得对,所以我备份到XMLbean声明):

<?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>

我为覆盖SoapFaultAnnotationExceptionResolver而编写的自定义类(起初,我扩展了SoapFaultMappingExceptionResolver:,如上面文章中所述):

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 !");
    }
}

但是,当我在端点中抛出ServiceException时,自定义类的customizeFault方法永远不会被命中。出于充分的原因,用作异常处理程序的类仍然是SoapFaultAnnotationException Resolver,而不是我的。。。

有人看到解释了吗?

已查看:

  • SoapFaultMappingExceptionResolver从未遇到常规java异常

像往常一样,我在网上发布一个小时后就解决了问题。我应该早点做的!

我试图覆盖的bean名称/id不正确。在扫描了大量org.springframework.bean调试日志后,我发现正确的bean名称是soapFaultAnnotationExceptionResolver

我还设法将配置转换为Java形式:

package foo.bar.ws;
// Skipping imports...
/**
 * WS configuration and WSDL definition
 */
@EnableWs
@Configuration
public class WebServiceConfig extends WsConfigurerAdapter {
    public final static Logger logger = Logger.getLogger( WebServiceConfig.class );
    // Skipping other bean declarations...
    @Bean(name = "soapFaultAnnotationExceptionResolver")
    public DetailSoapFaultDefinitionExceptionResolver exceptionResolver( ApplicationContext applicationContext ){
        DetailSoapFaultDefinitionExceptionResolver exceptionResolver = new DetailSoapFaultDefinitionExceptionResolver();
        SoapFaultDefinition soapFaultDefinition = new SoapFaultDefinition();
        soapFaultDefinition.setFaultCode( SoapFaultDefinition.SERVER );
        exceptionResolver.setDefaultFault( soapFaultDefinition );
        return exceptionResolver;
    }
}

我知道这个响应已经过时了,但也许它对其他人有效。

MessageDispatcher默认情况下引发两个Resolver:SimpleSoapExceptionResolver和SoapFaultAnnotationException Resolver。如果要获取带有自定义代码和错误消息的soap错误,则必须声明正确的顺序,以便先获取SoapFaultannotationException,然后再获取SimpleSoapException Resolver。

步骤1。在bean上对应的配置文件:

<bean   class="org.springframework.ws.soap.server.endpoint.SoapFaultAnnotationExceptionResolver">
    <property name="order" value="1"/>
</bean>
<bean class="org.springframework.ws.soap.server.endpoint.SimpleSoapExceptionResolver">
    <property name="order" value="2"/>
</bean>

步骤2。声明您的例外情况如下:

@SoapFault(faultCode = FaultCode.CUSTOM,locale="en",faultStringOrReason = "CUSTOM_MESSAGE",customFaultCode="YOUR_NAMESPACE + YOUR_CUSTOM_CODE")
public class DeclaracionNotFoundException extends BusinessException {
public DeclaracionNotFoundException(){
    super();
}
public DeclaracionNotFoundException(String message) {
    super(message);
}
}

步骤3。

正常在代码中引发异常

抛出新的DeclaracionNotFoundException()//带有来自faultStringOrReason的默认消息或抛出新的DeclaracionNotFoundException("Ops!!")//带有其他消息

它对我有效,我得到了以下内容:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
      <SOAP-ENV:Fault>
         <faultcode xmlns:ns0="http://com.example">ns0:4</faultcode>
         <faultstring xml:lang="en">Ops !!!</faultstring>
      </SOAP-ENV:Fault>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我定义了faultCode=4和faultString=Ops!!!

问候

最新更新