tôi đang làm việc trên dự án JSF với Spring và Hibernate mà trong số những thứ khác có một số Converter
s mà làm theo cùng một khuôn mẫu:Thực hiện chuyển đổi cho các đối tượng với Java Generics
getAsObject
nhận chuỗi đại diện của đối tượng id, chuyển nó đến một con số, và lấy đơn vị của các loại nhất định và id chogetAsString
nhận và thực thể và trả về id của đối tượng chuyển đổi sangString
Mã này về cơ bản là những gì sau (kiểm tra bỏ qua):
@ManagedBean(name="myConverter")
@SessionScoped
public class MyConverter implements Converter {
private MyService myService;
/* ... */
@Override
public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value) {
int id = Integer.parseInt(value);
return myService.getById(id);
}
@Override
public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value) {
return ((MyEntity)value).getId().toString();
}
}
Với số lượng lớn các Converter
s mà là chính xác như thế này (trừ các loại MyService
và MyEntity
tất nhiên), tôi đã tự hỏi nếu nó có giá trị bằng cách sử dụng một bộ chuyển đổi chung duy nhất. Việc thực hiện chung chung không phải là khó khăn, nhưng tôi không chắc chắn về cách tiếp cận đúng để khai báo Đậu.
Một giải pháp khả thi như sau:
1 - Viết bài thi chung, chúng ta hãy gọi nó MyGenericConverter
, mà không cần bất kỳ Bean chú thích
2 - Viết bài quảng cáo chuyển đổi cụ thể một lớp con của MyGenericConverter<T>
và chú thích nó như là cần thiết:
@ManagedBean(name="myFooConverter")
@SessionScoped
public class MyFooConverter implements MyGenericConverter<Foo> {
/* ... */
}
Trong khi viết điều này, tôi có thể chỉ cần viết một lớp cơ sở với việc triển khai hai phương pháp, một d subclass khi cần thiết.
Có một vài chi tiết không quan trọng cần phải được quan tâm (như thực tế là tôi phải trừu tượng lớp MyService
theo một cách nào đó) vì vậy câu hỏi đầu tiên của tôi là: liệu nó có đáng giá không?
Và nếu có, có cách tiếp cận nào khác không?
Sử dụng "id" tài sản là không được khuyến nghị bằng phương thức equals và hashCode: Chúng khuyên bạn nên thực hiện equals() và hashCode() bằng cách sử dụng phương thức Business keyality: https://docs.jboss.org/hibernate/stable/core.old/reference/en/html/persistent-classes -equalshashcode.html Và làm thế nào về id tổng hợp? –