Tôi đang vật lộn một chút với tính năng truyền lớp. Để tôi đặt cảnh. Tôi có mã máy chủ java sử dụng một lớp dịch vụ và dàn nhạc. Một yêu cầu đi vào lớp dịch vụ trong một định dạng bean (lớp java liên kết với khung nhìn front end), và sau đó tôi có một loạt các lớp domainBeanMapper lấy một đối tượng định dạng bean và dịch nó thành một đối tượng định dạng miền. Ví dụ: UserBean có một dateOfBirth được biểu diễn bằng một chuỗi, trong khi User có dateOfBirth được biểu diễn bởi một Date để UserMapper.java sẽ làm cho chuỗi ngày tháng thành một đối tượng ngày tháng. Vì vậy, đối với mỗi đối tượng trong hệ thống, tôi có * .java, * Bean.java và * Mapper.java (User.java, UserBean.java, userMapper.java).Java - truyền tới giao diện, sau đó tìm hiểu loại được đúc là
trong applicationContext tôi giữ mối quan hệ của từng đối tượng để ánh xạ của họ, như thế này:
<util:map id="domainBeanMappers">
<entry key="UserBean" value-ref="userMapper" />
<entry key="User" value-ref="userMapper" />
.....
và sau đó tôi xác định mapper:
<bean id="userMapper" class="com.me.mapping.UserMapper" parent="baseDomainBeanMapper"/>
tôi gọi là người vẽ bản đồ đậu miền như thế này từ lớp dịch vụ của tôi:
UserBean userBean = (UserBean) getDomainBeanMapper().mapDomainToBean(user);
Khi chạy mã này tôi tìm thấy người lập bản đồ ct mà tôi muốn như thế này:
DomainBeanMapper mapper = findApplicableMapper(myObject.getClass().getName());
if (mapper == null) {
mapper = findApplicableMapper(myObject.getClass().getSimpleName());
}
nơi findApplicableMapper làm việc như thế này:
private DomainBeanMapper findApplicableMapper(String string) {
return domainBeanMappers.get(string);
}
Trong vài năm trở lại đây, điều này đã làm việc như một nét duyên dáng. Đối với bất kỳ đối tượng nào tôi muốn trong hệ thống, tôi có thể dễ dàng chọn ra trình ánh xạ có liên quan và sau đó dịch từ định dạng bean sang định dạng miền và ngược lại, dựa trên cuộc gọi .getClass() của bất kỳ cá thể nào.
Bây giờ, tôi có một yêu cầu mới khiến tôi gặp rắc rối. Tôi muốn có thể dịch từ đối tượng User của tôi sang một số đối tượng phụ dựa trên tham số. Vì vậy, đối với một số cuộc gọi, tôi chỉ muốn id, firstName và lastName trở lại. Đối với các cuộc gọi khác, tôi muốn nhiều trường hơn, nhưng vẫn không phải toàn bộ đối tượng, và sau đó đối với một số cuộc gọi, tôi muốn toàn bộ đối tượng quay lại như trước đây. Tôi không muốn đi xuống con đường phụ đối tượng và kết thúc với UserLight, UserLightWithName, UserLightWithNameButNoAddress, ... argh nightmare.
Vì vậy, thay vào đó, tôi đã hy vọng tạo ra một loạt giao diện đại diện cho "lượt xem". Vì vậy, yêu cầu đến với ViewType of Basic và điều đó có nghĩa là tôi muốn chi tiết và địa chỉ cá nhân của người dùng. Vì vậy, tôi đã viết một giao diện được gọi UserBasic, có tài khoản để thực hiện nó, và thêm một ánh xạ từ UserBasic để UserBasicMapper, và từ UserBasicBean để UserBasicMapper, với hy vọng rằng tôi có thể thực hiện cuộc gọi dịch như thế này:
UserBasicBean restrictedUserReturn = (UserBasicBean) getDomainBeanMapper().mapDomainToBean((UserBasic)user);
nhưng điều này không làm việc vì getClass() luôn luôn trả về lớp cá thể, không phải là giao diện mà nó đã được đưa vào. Tôi đoán tôi luôn có thể thêm một paramater khác cho cuộc gọi mapDomainToBean là lớp mà tôi muốn sử dụng, nhưng codebase khá lớn và tôi sẽ cần phải chạm vào mọi cuộc gọi nếu tôi thực hiện thay đổi đó.
Vì vậy, về cơ bản tôi đang tìm cách để truyền một thể hiện sang loại giao diện và sau đó tìm loại giao diện đó? Điều này có thể không?
thánh ngón tay ...
Tại sao bạn không muốn toàn bộ đối tượng? –
đó là yêu cầu bảo mật. một số người dùng nhất định của hệ thống chỉ có thể thấy một số phần nhất định của đối tượng. – Margaret