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
và @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ó?
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 –