Tôi đã đi qua tài liệu và mã nguồn Spring và vẫn chưa tìm thấy câu trả lời cho câu hỏi của mình.Ràng buộc dữ liệu của lớp trừu tượng trong spring-mvc
Tôi có các lớp này trong mô hình miền của mình và muốn sử dụng chúng làm đối tượng biểu mẫu sao lưu trong spring-mvc.
public abstract class Credentials {
private Long id;
....
}
public class UserPasswordCredentials extends Credentials {
private String username;
private String password;
....
}
public class UserAccount {
private Long id;
private String name;
private Credentials credentials;
....
}
điều khiển của tôi:
@Controller
public class UserAccountController
{
@RequestMapping(value = "/saveAccount", method = RequestMethod.POST)
public @ResponseBody Long saveAccount(@Valid UserAccount account)
{
//persist in DB
return account.id;
}
@RequestMapping(value = "/listAccounts", method = RequestMethod.GET)
public String listAccounts()
{
//get all accounts from DB
return "views/list_accounts";
}
....
}
On UI Tôi có hình thức năng động cho các loại chứng chỉ khác nhau. yêu cầu POST tôi thường trông giống như:
name name
credentials_type user_name
credentials.password password
credentials.username username
ngoại lệ Sau đây là ném nếu tôi cố gắng đưa ra yêu cầu đến máy chủ:
org.springframework.beans.NullValueInNestedPathException: Invalid property 'credentials' of bean class [*.*.domain.UserAccount]: Could not instantiate property type [*.*.domain.Credentials] to auto-grow nested property path: java.lang.InstantiationException
org.springframework.beans.BeanWrapperImpl.newValue(BeanWrapperImpl.java:628)
suy nghĩ ban đầu của tôi là sử dụng @ModelAttribute
@ModelAttribute
public PublisherAccount prepareUserAccountBean(@RequestParam("credentials_type") String credentialsType){
UserAccount userAccount = new PublisherAccount();
Class credClass = //figure out correct credentials class;
userAccount.setCredentials(BeanUtils.instantiate(credClass));
return userAccount;
}
Vấn đề với phương pháp này là phương pháp prepareUserAccountBean
được gọi trước bất kỳ phương thức nào khác (như listAccounts
) cũng như không thích hợp.
Một giải pháp mạnh mẽ là di chuyển cả hai prepareUserAccountBean
và saveUserAccount
vào Bộ điều khiển riêng biệt. Nó không có vẻ đúng: Tôi muốn tất cả các hoạt động liên quan đến người dùng cư trú trong cùng một lớp điều khiển.
Bất kỳ giải pháp đơn giản nào? Tôi có thể sử dụng bằng cách nào đó DataBinder, PropertyEditor hoặc WebArgumentResolver?
Cảm ơn bạn !!!!!
Bạn có thể đăng toàn bộ mã từ các lớp miền của mình không? Tôi muốn thấy các nhà thầu của bạn. –
Âm thanh với tôi như thế này có nhiều vấn đề về lập bản đồ/tuần tự hóa/chuyển đổi hơn với cơ sở dữ liệu của bạn hơn là với chế độ xem. Các tài khoản được deserialized một cách chính xác vào các đối tượng chính xác trước khi được gửi đến xem? – DavidA