2016-02-29 3 views
2

Я пытаюсь реализовать пользовательские мыльных ошибки, как показано ниже:Пользовательские Ошибки SOAP в пружинный интеграции кода ошибки имен

@SoapFault(faultCode = FaultCode.CUSTOM, customFaultCode="{namespace}Server Error", faultStringOrReason="Error encountered when processing request message.") 
public class SystemFault extends BusinessException{ }. 

Неисправность мыла выброшен имеет ниже формат:

<.SOAP-ENV:Fault> 
    <.faultcode xmlns:ns0="namespace">ns0:star:Server Error<./faultcode> 
    <.faultstring xml:lang="en">Error Encountered when processing the request.<./faultstring> 
<./SOAP-ENV:Fault> 

Как вы можете см., код кода ошибки появляется с объявлением пространства имен. Пожалуйста, дайте мне знать, если это все равно, чтобы этого избежать. Формат клиента неисправностей мыла ожидает это:

<.soapenv:Fault xmlns:star="http://www.starstandard.org/STAR/5"> 
    <.faultcode>star:Custom Fault Code<./faultcode> 
    <.faultstring>Custom Fault message<./faultstring> 
<./soapenv:Fault> 

Я Проверено AbstractSoapFaultDefinitionExceptionResolver.resolveExceptionInternal() метода, и он ожидает QName экземпляра для кода ошибки, а не строки. Пожалуйста, дайте мне знать, как это решить.

ответ

0

Похоже, вы почти там с вашим синтаксисом customFaultCode!

Давайте пересмотреть, что больше JavaDoc один раз:

/** 
* The custom fault code, to be used if {@link #faultCode()} is set to {@link FaultCode#CUSTOM}. 
* 
* <p>The format used is that of {@link QName#toString()}, i.e. "{" + Namespace URI + "}" + local part, where the 
* namespace is optional. 
* 
* <p>Note that custom Fault Codes are only supported on SOAP 1.1. 
*/ 
String customFaultCode() default ""; 

Итак, я просто решил посмотреть, что же это {@link QName#toString()}:

public String toString() { 
    if (namespaceURI.equals(XMLConstants.NULL_NS_URI)) { 
     return localPart; 
    } else { 
     return "{" + namespaceURI + "}" + localPart; 
    } 
} 

Где что XMLConstants.NULL_NS_URI, как:

public static final String NULL_NS_URI = ""; 

Отныне, похоже, вам будет достаточно объявить, что, как pla в строке:

customFaultCode="Server Error" 

Хотя, если вы хотите переместить xmlns декларацию на высшем уровне следует рассмотреть возможность использования более низкого уровня API в пользовательских AbstractSoapFaultDefinitionExceptionResolver расширение:

((SoapMessage) messageContext.getResponse()).getEnvelope().addNamespaceDeclaration("star", "http://www.starstandard.org/STAR/5"); 

И правильно, использовать customFaultCode с сырым префиксом:

customFaultCode="star:Server Error" 
+0

Привет, Артем, спасибо за подробную почту. Я нашел проблему с этим. Существует вызов метода из AbstractSoapFaultDefinitionExceptionResolver.getFaultDefinition(), как показано ниже fault = soap11Body.addFault (definition.getFaultCode(), faultStringOrReason, definition.getLocale()); Таким образом, в SaajSoap11Body существует инструкция Assert.Ahert.hasLength (faultCode.getNamespaceURI(), "namespaceUri ErrorCode не может быть пустым") ;. Это вызывает проблему. –

+0

Ну, если вы можете объявить свои 'xmlns' в корневом элементе' '', вы все равно можете объявить его как прежде с экземпляром '{namespace}'. В соответствии с 'FaultImpl' он должен' обеспечиватьNamespaceIsDeclared() ', что означает повторное использование и существующие' xmlns'. –

+0

Я могу привести объявление пространства имен в , переопределив метод resolveExceptionInternal. Но я не могу принести объявление пространства имен в тег –

0

Это, кажется, старый пост, но просто хочу попробовать помочь. Я думаю, вам не стоит беспокоиться о коде ошибки и описании ошибок. На самом деле есть третье поле в элементе soapFault whitch называется detail. Этот элемент имеет два подэлемента, называемых кодом и описанием. Используйте это, чтобы нести информацию о неисправности.

Проверить этот пост: http://memorynotfound.com/spring-ws-add-detail-soapfault-exception-handling/

Надеется, что это может помочь. Спасибо

+0

Пожалуйста, напишите соответствующие разделы ответа здесь, поскольку ссылки могут меняться со временем. –

Смежные вопросы