Я работаю над проектом JSF с Spring и Hibernate, который среди прочего имеет несколько Converter
, которые следуют одному и тому же шаблону:
-
getAsObject
получает строковое представление идентификатора объекта, преобразует его в число и извлекает объект данного вида и указанный id -
getAsString
принимает и сущность и возвращает идентификатор объекта, преобразованного вString
Код по существу следующий (проверки опущены):
@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();
}
}
Учитывая большое количество Converter
, которые точно такие же (за исключением типа MyService
и MyEntity
, конечно), мне было интересно, стоит ли использовать один общий конвертер.
Внедрение родового само по себе не сложно, но я не уверен в правильном подходе к объявлению Beans.
Возможное решение состоит в следующем:
1 - Напишите общую реализацию, позвоните ей MyGenericConverter
, без аннотации Bean
2 - Напишите конкретный конвертер объявлений подкласса MyGenericConverter<T>
и аннотируйте его по мере необходимости:
@ManagedBean(name="myFooConverter")
@SessionScoped
public class MyFooConverter implements MyGenericConverter<Foo> {
/* ... */
}
При написании этого я понял, что, возможно, Generic действительно не нужен, поэтому, возможно, я мог бы просто написать базовый класс с реализацией двух методов и подкласса по мере необходимости.
Есть несколько нетривиальных деталей, о которых нужно позаботиться (например, тот факт, что мне пришлось бы каким-то образом отделить класс MyService
), поэтому мой первый вопрос: стоит ли хлопот?
И если да, есть ли другие подходы?