Я работаю над проектом 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), поэтому мой первый вопрос: стоит ли хлопот?
И если да, есть ли другие подходы?
