2013-07-04 12 views
12

Tôi có một lớp học với chú thích xác nhận chế độ ngủ đông trên một số lĩnh vực (ví dụ như @NotNull@Size(min = 4, max = 50), vv ...)Làm cách nào tôi có thể gọi cho trình xác nhận hợp lệ chạy trên phương thức @RequestMethod với tham số @Valid trong Spring?

public class MyClass { 

    Long id; 

    @NotEmpty 
    @Size(min = 4, max = 50) 
    String machineName; 

    @NotEmpty 
    @Size(min = 4, max = 50) 
    String humanName; 

    // Getters, setters, etc… 
} 

Tôi cũng có một bộ điều khiển tùy chỉnh mà đóng vai trò như một API JSON, và một deserializer JSON tạo các đối tượng MyClass khi các phương thức API được gọi. Trong điều khiển tùy chỉnh của tôi Tôi có một phương pháp để tạo ra một đối tượng mới của loại rằng:

@RequestMapping(method = RequestMethod.POST) 
public long createMyObject(@RequestBody @Valid MyClass newObj) { 
    // Create the object in the database 
    return newObj.getId(); 
} 

và một phương pháp mà cập nhật một đối tượng hiện

@RequestMapping(method = RequestMethod.PUT) 
public void updateMyObject(@RequestBody MyClass updatedObj) { 
    MyClass existingObj = // Get existing obj from DB by updatedObj.getId(); 

    // Do some secondary validation, such as making sure that a specific 
    // field remains unchanged compared to the existing instance 
    if (existingObj.getMachineName() != null && 
      !existingObj.getMachineName().equals(updatedObj.getMachineName())) { 
     throw new CannotChangeMachineNameException(); 
    } 
    else { 
     updatedObj.setMachineName(existingObj.getMachineName()); 
    } 

    // [HERE IS WHERE I WANT THE MAGIC TO HAPPEN] 

    // Save updatedObj to the database 
} 

Trong khi tôi có thể sử dụng @Valid trong createMyObject, tôi không thể sử dụng nó trong updateMyObject vì việc triển khai API của chúng tôi yêu cầu machineName không thay đổi - người dùng có thể gọi API bằng đối tượng JSON loại trừ hoàn toàn machineName hoặc điền vào cùng một giá trị tồn tại trong cơ sở dữ liệu. *

Trước khi lưu đối tượng đã cập nhật vào cơ sở dữ liệu tôi muốn gọi trình xác nhận hợp lệ có chú thích @Valid sẽ được gọi. Tôi làm cách nào để tìm trình xác thực này và sử dụng nó?

+1

Tôi nghĩ bạn có thể sử dụng các nhóm xác nhận. Có tất cả các xác nhận hợp lệ khác với '@ NotNull' trên' machineName' (hoặc một trình xác nhận hợp lệ tùy chỉnh so sánh tên cũ và mới) trong nhóm mặc định và có trình xác nhận còn lại nằm trong nhóm 'Update'. Sử dụng cả hai nhóm trong phương thức 'updateMyObject'. Xem http://docs.jboss.org/hibernate/validator/5.0/reference/en-US/html/chapter-groups.html#d0e2595 –

Trả lời

6

Không có gì nói rằng bạn chỉ cần sử dụng @Valid trong các phương thức điều khiển của bạn. Tại sao không thực hiện một phương thức xác thực chấp nhận tham số mà bạn chú thích là @Valid, thì chỉ cần trả về cùng một tham số đó.

Như thế này:

public Book validateBook(@Valid Book book) { 
    return book; 
} 

Hình như một sự thay thế sẽ được sử dụng gói xác nhận của Hibernate. Here's it's documentation.

Về cơ bản, bạn sẽ có được một Validator từ một ValidationFactory, và sau đó sử dụng trình xác thực sẽ như thế này:

@Test 
    public void manufacturerIsNull() { 
     Car car = new Car(null, "DD-AB-123", 4); 

     Set<ConstraintViolation<Car>> constraintViolations = 
      validator.validate(car); 

     assertEquals(1, constraintViolations.size()); 
     assertEquals("may not be null", constraintViolations.iterator().next().getMessage()); 
} 
+1

Cảm ơn! Điều này dẫn tôi đủ gần câu trả lời - phương pháp đầu tiên không hoạt động, tôi đã làm một cái gì đó tương tự như phương pháp thứ hai: Đặt > errors = Validation.buildDefaultValidatorFactory(). GetValidator(). Validate (updatedObj); // Tôi đã nhận được điều này từ tài liệu bạn đã chỉ – daniel

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