2013-07-04 19 views
11

Tôi hiện đang viết một bộ dịch vụ web mới bằng cách sử dụng JAX-WS nhưng tôi đang gặp khó khăn khi quyết định cách tốt nhất để xác thực các yếu tố đầu vào. Tôi có thể làm một số xác nhận trong các lớp thực hiện của tôi nhưng một số lỗi đầu vào không âm thầm. Ví dụ dữ liệu ký tự trong một phần tử số sẽ dẫn đến một số nguyên null trong đối tượng JAXB.Cách tốt nhất để xác thực các đầu vào JAX-WS?

Đây là những thiết kế mà tôi đã gặp.

  1. @SchemaValidation
    tôi có thể thêm chú thích cho cả lớp nghe endpoint và JAX-WS sẽ chăm sóc của việc xác thực. Điều này làm việc tại địa phương trong tomcat nhưng có những lo ngại rằng nó sẽ không hoạt động trên một số máy chủ. Nét chính của tôi là tôi phải đầu hàng kiểm soát cách các lỗi được xuất ra trong phản hồi.

  2. Tất cả đầu vào là chuỗi
    Tôi ghét phương pháp này nhưng tôi đã thấy các dịch vụ web khác trong đó tất cả đầu vào được xác định là chuỗi. Điều này sẽ nắm bắt trường hợp dữ liệu ký tự trong một phần tử số vì tôi có thể kiểm tra nó nơi tôi gọi API của chúng tôi mặc dù bạn vẫn sẽ bỏ lỡ bất kỳ phần tử xml được đặt tên không chính xác nào.

Tôi thực sự muốn các lỗi quay lại theo cách tương tự như lỗi API hơn là lỗi xà phòng. Bất kỳ ý tưởng? Tôi đã nhìn thấy một vài trang web nói về việc chặn yêu cầu bằng một loại bộ lọc. Bạn không chắc chắn làm thế nào điều này sẽ làm việc với các phản ứng khác nhau cho các hoạt động khác nhau mặc dù.

E.G.

<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> 

Có thể tôi đang hỏi quá nhiều nhưng tôi nghĩ mình sẽ bỏ lỡ bất cứ điều gì. TIA.

Trả lời

7

Tìm thấy bài viết này giải thích một cách có thể.
http://one-size-doesnt-fit-all.blogspot.co.uk/2009/04/jax-ws-schemavalidation-custom-handler.html

Tôi có nó trả về thông báo lỗi phân tích cú pháp trong bố cục phản hồi tiêu chuẩn của tôi. tôi chỉ cần kiểm tra nó sẽ hoạt động trên máy khách hàng. (Một số người nói rằng họ đã gặp sự cố với @SchemaValidation)

+0

Lời nhắc nhở này đã nhắc tôi nhớ về điều này. Điều này hiện đang được sản xuất cho một số dự án và chúng tôi không có vấn đề gì. –

0

Im không chắc chắn nếu tôi hiểu u đúng, nhưng maby này giúp u:

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

+0

Đã có giao diện nhưng điều này giả định tôi có xml thô để hoạt động. Vào thời điểm điểm cuối của tôi nhận được yêu cầu, nó được ánh xạ tới một nhà thơ. –

7

Nếu bạn nhấn mạnh vào điều khiển (giống như bạn thường cần phải từ bỏ khi làm Jax-WS ...) , bạn có thể triển khai Nhà cung cấp và Người xác thực hợp lệ hóa đối với Lược đồ XSD.

Các XSD Schema sẽ chăm sóc chứng thực đầu vào (loại và có khả năng enumerations, mô hình phù hợp, vv ...)

Để thực hiện javax.xml.ws.Provider như SOAP của bạn Endpoint, tạo ra một lớp trông như

@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  
    } 
} 

A SOAPMessage sẽ được chuyển đến phương thức invoke, dự kiến ​​trả lại phản hồi hợp lệ hoặc SOAPFault được bao bọc trong SOAPMessage;

Để xác nhận agains một XSD, sử dụng một 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(); 

Giải nén SOAPBody xml và xác nhận nó chống lại Validator sử dụng phương pháp validate().

Exceptions Catch xung quanh xác nhận và xây dựng lỗi SOAP của riêng bạn:

//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); 

sau đó trả lại SOAPMessage chứa lỗi.

(Không, tôi không thích SOAP Web Services)

+0

lol tôi không, nhưng đôi khi chúng tôi không nhận được để lựa chọn;) Tôi đang cố gắng để giữ cho sự phát triển càng đơn giản càng tốt vì vậy tôi nghĩ rằng điều này có thể gây nhầm lẫn cho một số người. –

+0

Điều này có thể được sử dụng với Axis không? – ctomek

2

Trong kịch bản bạn đang cố gắng để đạt được, có sẽ không có bất kỳ lỗi SOAP. Logic xác thực (sẽ là một phần của mã xử lý yêu cầu cuối cùng là), phải đảm bảo rằng tất cả các kịch bản xác thực được xử lý.

Chúng tôi đã phải đối mặt với tình huống này khi bên thứ ba tích hợp các dịch vụ web của chúng tôi không thể giải mã được nhiều từ lỗi SOAP và chúng tôi đã tạo ra phản hồi lỗi giống như cách bạn đã hình thành. Tôi sẽ đề nghị cách tiếp cận sau đây.

  • Viết logic xác nhận của riêng bạn
  • Tạo một cấu trúc đối tượng thích hợp. Bạn đã có một định dạng XML. Chỉ cần phản đối nó.
  • Gọi logic xác thực này và chuyển các đối tượng nhập vào nó. Logic xác thực sẽ xác nhận tất cả các yếu tố đầu vào và điền vào đối tượng phản hồi thích hợp (myOperationResponse).
  • Khi trả về phương thức xác thực, hãy kiểm tra trạng thái hoặc đối tượng lỗi. Nếu có lỗi sau đó trả về đối tượng phản hồi HOẶC tiến hành xử lý yêu cầu thêm và sau đó trả về phản hồi thành công.
+2

Điều này nghe có vẻ như những gì đã xảy ra nhưng vấn đề là nếu nó không thể ánh xạ một phần tử vào đối tượng jaxb thì nó không thành công âm thầm. –

+0

Bạn nói đúng. Chỉ cần tò mò để biết nếu giá trị null của phần tử JAXB là chỉ báo đầy đủ cho sự thất bại xác nhận trong trường hợp của bạn. – Santosh

+0

Không thực sự. Làm thế nào bạn có thể cho biết nếu có một lỗi hoặc nếu nó là một yếu tố tùy chọn mà họ đã không vượt qua? –

Các vấn đề liên quan