2016-10-06 6 views
1

次のように私はカスタムWebFault例外を設定している:SOAP 1.2のフォルト "code value"と "locale"を更新していますか?

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

    private static final long serialVersionUID = -6647544772732631047L; 
    private WSFault fault; 

とエンドポイントのレベルで私のカスタム例外を投げるときに私は障害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> 

私が欲しいのTextタグのxml:langの値を制御して、送信されたエラーメッセージの言語とコード値<S:Value>を指定できるようにします。 @WebFaultでこれを行う方法はありますか?

答えて

1

これを解決するには、JAX-WS APIオブジェクトを使用し、例外をスローするのではなくカスタムの障害メッセージを作成することができました。そうすれば、必要な方法ですべてのタグにアクセスしてビルドすることができます:

// 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); 
関連する問題