Tôi đang sử dụng Spring để nhập và xác thực biểu mẫu. Lệnh của bộ điều khiển biểu mẫu chứa mô hình đang được chỉnh sửa. Một số thuộc tính của mô hình là một loại tùy chỉnh. Ví dụ, số an sinh xã hội của một người là một loại SSN tùy chỉnh.Xác thực mùa xuân, cách để PropertyEditor tạo thông báo lỗi cụ thể
public class Person {
public String getName() {...}
public void setName(String name) {...}
public SSN getSocialSecurtyNumber() {...}
public void setSocialSecurtyNumber(SSN ssn) {...}
}
và gói Person trong một hình thức mùa xuân chỉnh sửa lệnh:
public class EditPersonCommand {
public Person getPerson() {...}
public void setPerson(Person person) {...}
}
Kể từ mùa xuân không biết làm thế nào để chuyển đổi văn bản thành một SSN, tôi đăng ký một biên tập viên của khách hàng với chất kết dính các bộ điều khiển hình thức của:
public class EditPersonController extends SimpleFormController {
protected void initBinder(HttpServletRequest req, ServletRequestDataBinder binder) {
super.initBinder(req, binder);
binder.registerCustomEditor(SSN.class, "person.ssn", new SsnEditor());
}
}
và SsnEditor chỉ là một tùy chỉnh java.beans.PropertyEditor
mà có thể chuyển đổi văn bản đến một đối tượng SSN:
public class SsnEditor extends PropertyEditorSupport {
public String getAsText() {...} // converts SSN to text
public void setAsText(String str) {
// converts text to SSN
// throws IllegalArgumentException for invalid text
}
}
Nếu setAsText
gặp văn bản không hợp lệ và không thể chuyển đổi thành SSN, thì nó sẽ ném IllegalArgumentException
(theo thông số PropertyEditor
setAsText
). Vấn đề tôi gặp phải là việc chuyển đổi văn bản thành đối tượng (thông qua PropertyEditor.setAsText()
) diễn ra trước khi trình xác thực Spring của tôi được gọi. Khi setAsText
ném IllegalArgumentException
, Spring chỉ hiển thị thông báo lỗi chung được xác định trong errors.properties
. Những gì tôi muốn là một thông báo lỗi cụ thể phụ thuộc vào lý do chính xác tại sao SSN đã nhập không hợp lệ. PropertyEditor.setAsText()
sẽ xác định lý do. Tôi đã thử nhúng các lý do lỗi văn bản trong văn bản của IllegalArgumentException
, nhưng mùa xuân chỉ xử lý nó như là một lỗi chung chung.
Có giải pháp cho điều này không? Để lặp lại, những gì tôi muốn là thông báo lỗi cụ thể được tạo bởi PropertyEditor
để hiển thị thông báo lỗi trên biểu mẫu Mùa xuân. Cách thay thế duy nhất tôi có thể nghĩ là lưu trữ SSN dưới dạng văn bản trong lệnh và thực hiện xác thực trong trình xác nhận hợp lệ. Văn bản để chuyển đổi đối tượng SSN sẽ diễn ra trong biểu mẫu onSubmit
. Điều này là ít mong muốn như hình thức của tôi (và mô hình) có nhiều thuộc tính và tôi không muốn phải tạo và duy trì một lệnh có mỗi và mọi thuộc tính mô hình như là một trường văn bản.
Trên đây chỉ là một ví dụ, mã thực tế của tôi không phải là Person/SSN, do đó không cần phải trả lời với "tại sao không lưu trữ SSN dưới dạng văn bản ..."
@Steve Kuo Đã thêm vào câu trả lời gốc –