2010-12-12 34 views
10

JSR-303 cũng được dùng để xác thực tham số phương thức?Phương thức xác thực tham số với JSR-303

Nếu có, có ví dụ nào trên web không? Thách thức lớn nhất mà tôi đang phải đối mặt là làm thế nào để có được một validator trong mỗi phương thức. Với Spring 3, điều đó không có nghĩa là tôi phải tiêm hầu như mọi lớp với một số LocalValidatorFactoryBean?

Cảm ơn!

Trả lời

3

Điều này nghe giống như trường hợp sử dụng cho AOP (AspectJ). Viết một đường cắt cho các phương thức được chú thích bằng javax.validation.constraints.*, đưa trình xác thực vào khía cạnh (có thể sử dụng Spring) và sử dụng lời khuyên @Before hoặc @Around để thực hiện xác thực trước khi thực thi phương pháp.

Đọc AspectJ in Action để tham khảo.

3

Các javadocs cho mỗi chú thích JSR 303 nói như sau:

@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER}) 

Xem, PARAMETER là ở đó. Vì vậy, có, đó là về mặt kỹ thuật có thể.

Dưới đây là một ví dụ:

public void method(@NotNull String parameter) { 
    // ... 
} 

Tôi tuy nhiên không chắc chắn làm thế nào mà tích hợp với mùa xuân kể từ khi tôi không sử dụng nó. Bạn chỉ có thể thử.

9

Xác thực cấp phương thức sẽ được hỗ trợ trong phiên bản sắp tới 4.2 của việc triển khai tham chiếu Hibernate Validator của JSR 303.

Như đã chỉ ra trong câu trả lời trước, điều này sẽ cho phép các chú thích ràng buộc (được xây dựng trong cũng như các loại được xác định tùy chỉnh) được xác định tại tham số phương thức và giá trị trả về để xác định trước và sau điều kiện cho lời gọi của phương thức.

Lưu ý rằng HV sẽ chỉ xử lý việc xác thực thực tế các cuộc gọi phương thức không phải bằng việc kích hoạt xác thực như vậy. Yêu cầu xác thực có thể được thực hiện bằng cách sử dụng AOP hoặc các phương thức chặn khác của phương thức như các proxy động của JDK.

Vấn đề JIRA cho vấn đề này là HV-347 [1], vì vậy bạn có thể muốn tự thêm mình làm người xem cho vấn đề này.

[1] http://opensource.atlassian.com/projects/hibernate/browse/HV-347

+0

Tôi nghĩ rằng bài đăng trên blog của bạn bổ sung câu trả lời của bạn;) http://musingsofaprogrammingaddict.blogspot.com/2011/01/method-validation-with-h ibernate.html – Maxym

+0

Gunnar là tốt đẹp, đủ để đưa giải pháp của mình vào [GitHub] (https://github.com/gunnarmorling/methodvalidation-integration). Làm việc tuyệt vời cho tôi. – Patrick

0

Bạn có thể sử dụng jcabi-aspects (Tôi là một nhà phát triển), được tích hợp JSR 303 với AspectJ. Việc xác thực thực tế được thực hiện bởi một trong các triển khai JSR 303, mà bạn sẽ phải thêm vào đường dẫn lớp, như Hibernate Validator hoặc Apache BVal.

2

Trong mùa xuân 3.1.0 bạn có thể sử dụng chú thích @Validated để kích hoạt xác thực trên một bài thơ. Tạo giao diện cho lớp pojo, đặt chú thích này lên đó, sau đó thêm chú thích xác nhận của bạn vào các định nghĩa phương thức.(Giao diện là cần thiết bởi vì mùa xuân sẽ tạo ra một lớp proxy sử dụng giao diện như định nghĩa)

@Validated 
public interface PojoClass { 
    public @NotNull String doSomething(@NotEmpty String input); 
} 

POJO của bạn:

public class PojoClassImpl implements PojoClass { 
    public String doSomething(String input) { 
     return ""; 
    } 
} 

Bắt đầu từ một ứng dụng web mùa xuân tiêu chuẩn với xác nhận hoạt động, hãy nhớ thêm vào trong cấu hình mùa xuân của bạn tuyên bố đậu này:

<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/> 
+0

Đối với một số lý do lạ ConstraintViolationException public \ @NotNull String doSomething(); không hoạt động nhưng \ @KhôngKhông công khai String doSomething(); đã làm. Đã sử dụng thanh để thoát khỏi biểu tượng At đã bị người dùng gây nhầm lẫn với S.O – borjab

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