int-ws:inbound-gateway SoapExceptionResolver

时间:2014-09-17 21:11:49

标签: web-services soap spring-integration

有谁能告诉我spring集成的位置:inbound-gateway设置它的SOAP Exception Resolver? 出站网关有一个我可以设置的属性,但入站没有。
我在将SOAPFault返回给调用者之前设置了Soap Fault Details。 我查看了AbstractSoapFaultDefinitionExceptionResolver并尝试将其追溯到我可以设置它的地方,但我似乎失败了。

任何人都有机会指出我正确的方向。

*********** UPDATE ********** 就像FYI一样,这是我根据Artem的建议得出的最终解决方案:

<bean id="exceptionResolver"
    class="com.cloud.utils.CloudSoapFaultDefinitionResolver">
    <property name="defaultFault" value="SERVER" />
</bean>


public class CloudMessagingSoapFaultDefinitionResolver extends SoapFaultAnnotationExceptionResolver {
private Logger log = LoggerFactory.getLogger(getClass());
private static final int THREE = 3;

/* (non-Javadoc)
 * @see org.springframework.ws.soap.server.endpoint.AbstractSoapFaultDefinitionExceptionResolver#customizeFault(java.lang.Object, java.lang.Exception, org.springframework.ws.soap.SoapFault)
 */
@Override
protected void customizeFault(Object endpoint, Exception ex, SoapFault fault) {
    SoapFaultDetail details = fault.addFaultDetail();
    Method[] methods = ex.getClass().getDeclaredMethods();
    if (ex instanceof MonitiseCloudServicesException) {
        AbstractRuntimeException mcse = (AbstractRuntimeException) ex;
        methods = mcse.getClass().getDeclaredMethods();
    }
    for(Method m:methods){
        addDetailsElement(ex, details, m);
    }
}

/**
 * @param ex
 * @param details
 * @param m
 */
private void addDetailsElement(Exception ex, SoapFaultDetail details, Method m) {
    if(m.getName().startsWith("get")){
        SoapFaultDetailElement element = details.addFaultDetailElement(new QName(m.getName().substring(THREE)));
        try {
            element.addText((String) m.invoke(ex, new Object[]{}));
        } catch (IllegalAccessException | IllegalArgumentException
                | InvocationTargetException e) {
            log.error("An error occured processing the SOAPFault detail node {}.",m.getName().substring(THREE));
        }
    }
}

}

1 个答案:

答案 0 :(得分:1)

实际上不要混合inboundoutbound部分。从Spring WS的角度来看,它们分别是serverclient。它们具有不同的配置性质。

因此,在服务器部分,您可以这样做:

<bean id="exceptionResolver"
    class="org.springframework.ws.soap.server.endpoint.SoapFaultMappingExceptionResolver">
    <property name="defaultFault" value="SERVER"/>
    <property name="exceptionMappings">
        <value>
            org.springframework.oxm.ValidationFailureException=CLIENT,Invalid request
        </value>
    </property>
</bean>

这是因为任何Spring Integration <ws:inbound-gateway>都是标准Spring WS MessageDispatcherServlet配置的一部分:

<bean class="org.springframework.ws.server.endpoint.mapping.UriEndpointMapping"
      p:defaultEndpoint-ref="ws-inbound-gateway"/>

所有Faul Resolving工作都由Spring WS完成。