我正在使用Spring和Hibernate进行JSF项目,其中除其他外,还有许多Converter遵循相同模式的s:
getAsObject 接收对象id的字符串表示形式,将其转换为数字,并获取给定种类和给定id的实体
getAsString 接收和实体,并返回转换为的对象的ID 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完全像这样的s(当然MyService和类型除外MyEntity),我想知道是否值得使用单个通用转换器。泛型本身的实现并不困难,但是我不确定声明Bean的正确方法。
可能的解决方案如下:
1-编写通用实现,我们称之为MyGenericConverter,没有任何Bean批注
2-将特定的转换器广告编写为的子类,MyGenericConverter<T>并根据需要对其进行注释:
@ManagedBean(name="myFooConverter")
@SessionScoped
public class MyFooConverter implements MyGenericConverter<Foo> {
/* ... */
}
在编写本文时,我意识到也许并不是真的需要泛型,所以也许我可以简单地编写具有这两种方法的实现的基类,并根据需要编写子类。
有一些非琐碎的细节需要处理(例如,我必须以MyService某种方式抽象类的事实),所以我的第一个问题是:值得为之烦恼吗?
如果是这样,还有其他方法吗?
阿晨1998