2012-02-28 27 views
5

Có thể sử dụng hiệu quả các chú thích JSR303 (Bean Validation) trên các tài nguyên JAX-RS không?Xác thực tài nguyên JAX-RS (Apache Wink) với JSR303?

Vì vậy, ví dụ: nếu tôi có thành viên tài nguyên mà tôi đã chú thích @NotEmpty, hãy tạo lại lỗi cho máy khách nếu hạn chế này không được đáp ứng?

Điều này có vẻ như là điều hiển nhiên phải làm, nhưng cũng hạnh phúc khi được cho biết cách tốt hơn (Tôi không muốn di chuyển xác xuống mức ORM/cơ sở dữ liệu)

Trả lời

3

Bạn có thực sự có nghĩa là chứng thực nguồn các thành viên? Thông thường các thành viên tài nguyên được tiêm theo cách này hay cách khác (đó là ngữ cảnh, hoặc thực thể, hoặc tham số đường dẫn/truy vấn/ma trận), miễn là khung công tác JAX-RS hoạt động, bạn sẽ nhận được các thành viên này được tiêm đúng cách.

Cá nhân tôi nghĩ sẽ hợp lý hơn khi xác thực thực thể vì nó đã đến bằng dây dẫn, được điền bởi một MessageBodyReader và về cơ bản bạn không biết bên trong là gì, đúng không?

Vì vậy, nếu bạn quyết định để xác nhận các thực thể, có một số phương pháp mà bạn có thể thực hiện:

  1. AFAIK, Apache Wink không hỗ trợ kiểm chứng thực built-in. Bạn có thể thực hiện một trình xử lý. Xem DeploymentConfiguration.initRequestHandlersChain(). Nó hỗ trợ thêm trình xử lý người dùng. Trong trình xử lý của bạn, bạn có thể thực hiện bất kỳ xác thực nào. Tôi thậm chí nghĩ rằng cộng đồng Wink sẽ vui mừng nếu bạn đóng góp mã này.
    Vấn đề duy nhất với cách tiếp cận này - nó liên kết với Apache Wink. Nó sẽ không hoạt động nếu bạn quyết định chuyển sang một khung công tác JAX-RS khác.

  2. Một cách tiếp cận khác là thực hiện xác thực này trong MessageBodyReader của riêng bạn. Tất cả những gì bạn cần làm là đăng ký một trình đọc đặc biệt cho các thực thể của bạn và xác nhận thực thể bên trong. Bạn vẫn có thể tận dụng các MessageBodyReaders chuẩn (như JAXB hoặc Jackson) bằng cách sử dụng @Context Providers.getMessageBodyReader(). Phần tốt của phương pháp này là chuẩn JAX-RS. Điều xấu là bạn sử dụng MessageBodyReaders cho thứ gì đó mà họ không được thiết kế.

  3. Cách tiếp cận đơn giản nhất là xác thực đối tượng trong dòng đầu tiên của mỗi phương pháp tài nguyên. Nó sẽ tạo ra một số mã trùng lặp, nhưng đôi khi sự đơn giản thắng.

1

Một giải pháp - vì tôi đang sử dụng Spring 2.5.x, tôi có thể tạo lớp bao bọc triển khai InitializingBean và ủy quyền cho trình xác thực của Hibernate. Nó hoạt động - có một giải pháp tốt hơn?

+0

Cập nhật - Tôi nghĩ điều này tương ứng với câu trả lời # 3 của @ Tarlog. – Brabster

+0

Thực ra tôi đã nghĩ là đặt nó vào thứ 4, nhưng sau đó quyết định bỏ nó ra. Vấn đề với cách tiếp cận này là lớp trình bao bọc có thể không có các chú thích từ lớp tài nguyên. Nó thực sự phụ thuộc vào cách bạn thực hiện nó. – Tarlog

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