Ошибка обновления SOAP 1.2 «значение кода» и «локаль»?

#java #soap #jax-ws #soapfault

#java #soap #jax-ws #soapfault

Вопрос:

Я установил пользовательское исключение WebFault следующим образом:

 @WebFault(name="WSFault", targetNamespace = "http://www.example.com/")
public class WSException extends Exception {

    private static final long serialVersionUID = -6647544772732631047L;
    private WSFault fau<
  

и я получаю приведенный ниже XML-файл ошибки при создании моего пользовательского исключения на уровне конечной точки: throw new WSException("1234","My Service Error"); :

 <S:Fault xmlns:ns4="http://schemas.xmlsoap.org/soap/envelope/">
         <S:Code>
            <S:Value>S:Receiver</S:Value>
         </S:Code>
         <S:Reason>
            <S:Text xml:lang="en">My Service Error</S:Text>
         </S:Reason>
         <S:Detail>
            <ns2:WSFault xmlns:ns2="http://www.example.com/">
               <faultCode>1234</faultCode>
               <faultString>My Service Error</faultString>
            </ns2:WSFault>
         </S:Detail>
      </S:Fault>
  

Я хочу управлять xml:lang значением в Text теге, чтобы можно было указать язык отправленного сообщения об ошибке, а также значение кода <S:Value> . Есть ли способ сделать это с @WebFault помощью?

Ответ №1:

Я смог решить эту проблему, используя объекты API JAX-WS и создав пользовательское сообщение об ошибке, а не просто выдав исключение. Таким образом, вы сможете получить доступ и создать все теги так, как хотите:

 // Create a new SOAP 1.2 message from the message factory and obtain the SOAP body
MessageFactory factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
SOAPMessage message = factory.createMessage();
SOAPBody soapBody = message.getSOAPPart().getEnvelope().getBody();

// get the fault
SOAPFault fault =  soapBody.addFault();

// since this is an error generated from the business application
// where SOAPValue is the standard value code "Sender|Reciever...etc"
QName faultName = new QName(SOAPConstants.URI_NS_SOAP_1_2_ENVELOPE, SOAPValue);
fault.setFaultCode(faultName);

// set the fault reason text
// where languageLocale is the passed language local, the Locale object can be used
fault.addFaultReasonText(errorMessage, languageLocale);

// generate the detail
Detail detail = fault.addDetail();

// add the error code entry
QName customCodeEntryName = new QName("http://www.example.com/", "customCode", "ns1");
DetailEntry customCodeEntry = detail.addDetailEntry(customCodeEntryName);
customCodeEntry.addTextNode("this is custom 123 code");

// throw the exception that shall generate the SOAP fault response XML message
throw new SOAPFaultException(fault);