簡體   English   中英

如何最好地驗證JAX-WS輸入?

[英]How best to validate JAX-WS inputs?

我目前正在使用JAX-WS編寫一組新的Web服務,但是我在確定驗證輸入的最佳方法時遇到了困難。 我可以在我的實現類中進行一些驗證,但是一些輸入錯誤會無聲地失敗。 例如,數字元素中的字符數據將導致JAXB對象中的null整數。

這些是我遇到過的設計。

  1. @SchemaValidation
    我可以將此注釋添加到端點類,JAX-WS將負責驗證。 這在tomcat本地工作,但有人擔心它在某些服務器上不起作用。 我的主要抱怨是我必須放棄控制錯誤在響應中的輸出方式。

  2. 所有輸入都是字符串
    我討厭這種方法,但我見過其他所有輸入都定義為字符串的Web服務。 這將捕獲數字元素中的字符數據的情況,因為我可以檢查它調用我們的API,盡管你仍然會錯過任何錯誤命名的xml元素。

我真的希望錯誤以與API錯誤相同的方式返回,而不是作為soap錯誤。 有任何想法嗎? 我看過一些網站正在談論用一種過濾器攔截請求。 不知道這對於不同的操作的不同響應如何工作。

例如

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <myOperationResponse>
         <return>
            <success>false</success>
            <errors>
               <error>
                  <code>UNIQUECODE</code>
                  <message>Message text</message>
               </error>
            </errors>
         </return>
      </myOperationResponse>
   </S:Body>
</S:Envelope>

也許我問的太多了,但我想我會錯過任何事情。 TIA。

如果您堅持控制(在執行Jax-WS時通常需要放棄...),您可以實現針對XSD架構驗證的Provider和Validator。

XSD Schema將負責驗證輸入(類型和可能的枚舉,模式匹配等...)

要將javax.xml.ws.Provider實現為SOAP端點,請創建一個類似的類

@javax.xml.ws.ServiceMode(value = javax.xml.ws.Service.Mode.MESSAGE)
@javax.xml.ws.WebServiceProvider(
    wsdlLocation = "WEB-INF/wsdl/MyService.wsdl", 
    targetNamespace = "urn-com-acme-webservice", 
    serviceName = "ProcessPurchaseOrderService", 
    portName = "ProcessPurchaseOrderPort"
)
public class ProcessPurchaseOrder implements Provider<SOAPMessage> {


            @override
    public SOAPMessage invoke(final SOAPMessage request) {

                //see below     
    }
}

SOAPMessage將傳遞給invoke方法,該方法返回一個包含在SOAPMessage中的有效響應或SOAPFault;

要再次驗證XSD,請使用javax.xml.validator

    URL url = this.getClass().getResource(xsdSchemaLocation);

    String language = XMLConstants.W3C_XML_SCHEMA_NS_URI;
    SchemaFactory factory = SchemaFactory.newInstance(language);
    Schema schema = factory.newSchema(url);

    validator = schema.newValidator();

解壓縮SOAPBody xml並使用validate()方法對Validator進行validate()

捕獲驗證周圍的異常並構建自己的SOAP Fault:

 //Build the SOAP Fault Response
 MessageFactory factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
 SOAPMessage response = factory.createMessage();

 SOAPFault fault = response.getSOAPBody().addFault();
 fault.setFaultString(myCustomErrorString);

 fault.addDetail().addChildElement("exception").addTextNode(myCustomErrorId);

然后返回包含錯誤的SOAPMessage。

(不,我不喜歡SOAP Web服務)

找到這篇文章解釋了一種可能的方法。
http://one-size-doesnt-fit-all.blogspot.co.uk/2009/04/jax-ws-schemavalidation-custom-handler.html

我讓它在我的標准響應布局中返回解析錯誤消息。 我只需要測試它將在客戶機器上工作。 (有人說他們遇到過@SchemaValidation的問題)

在您嘗試實現的場景中,不存在任何SOAP錯誤 驗證邏輯( 將成為最終處理請求的代碼的一部分 )必須確保處理所有驗證方案。

我們遇到過這樣的情況:第三方集成我們的Web服務無法從SOAP故障中解釋太多,我們通過創建錯誤響應就像您構思的那樣。 我建議采用以下方法。

  • 編寫自己的驗證邏輯
  • 創建適當的對象結構。 您已經有一種XML格式。 只需要將它客觀化。
  • 調用此驗證邏輯並將輸入對象傳遞給它。 驗證邏輯將驗證所有輸入並填充適當的響應對象( myOperationResponse )。
  • 返回驗證方法時,檢查狀態或錯誤對象。 如果有錯誤,則返回響應對象或繼續處理請求,然后返回成功響應。

我不確定我是否理解你,但maby這有助於你:

http://blog.bdoughan.com/2010/12/jaxb-and-marshalunmarshal-schema.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM