[英]How best to validate JAX-WS inputs?
我目前正在使用JAX-WS編寫一組新的Web服務,但是我在確定驗證輸入的最佳方法時遇到了困難。 我可以在我的實現類中進行一些驗證,但是一些輸入錯誤會無聲地失敗。 例如,數字元素中的字符數據將導致JAXB對象中的null整數。
這些是我遇到過的設計。
@SchemaValidation
我可以將此注釋添加到端點類,JAX-WS將負責驗證。 這在tomcat本地工作,但有人擔心它在某些服務器上不起作用。 我的主要抱怨是我必須放棄控制錯誤在響應中的輸出方式。
所有輸入都是字符串
我討厭這種方法,但我見過其他所有輸入都定義為字符串的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故障中解釋太多,我們通過創建錯誤響應就像您構思的那樣。 我建議采用以下方法。
myOperationResponse
)。 我不確定我是否理解你,但maby這有助於你:
http://blog.bdoughan.com/2010/12/jaxb-and-marshalunmarshal-schema.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.