我想在ManagedBean
中使用Converter
。 ManagedBean
负责从数据库中获取数据。在Converter
中我想将字符串转换为必须从数据库获取的对象。
这是我的转换器
@FacesConverter(forClass=Gallery.class, value="galleryConverter")
public class GalleryConverter implements Converter {
// of course this one is null
@ManagedProperty(value="#{galleryContainer}")
private GalleryContainer galleryContainer;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String galleryId) {
return galleryContainer.findGallery(galleryId);
...
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object gallery) {
...
}
}
我知道galleryContainer
将为空,如果我想将ManagedBean
注入Converter
我也可以将其标记为ManagedBean
。问题是我想以漂亮的方式做到这一点,我不想寻找一些“奇怪的解决方案”。也许问题出在我的申请表中?也许有一些其他好的解决方案来创建必须从数据库获取数据并在转换器中使用的对象?我还想提一下,我更愿意使用DependencyInjection
而不是使用new
语句创建新对象(它更容易测试和维护)。有什么建议吗?
答案 0 :(得分:13)
不应使用@FacesConverter
,而应使用@ManagedBean
,因为当前面对转换器不是有效的注入目标。尽管如此,您可以选择将转换器作为托管bean,因此在您的视图中将其称为converter="#{yourConverter}"
(通过托管bean名称)而不是converter="yourConverter"
(通过转换器ID)。
基本用法示例:
@ManagedBean
@RequestScoped
public class YourConverter implements Converter {
@ManagedProperty...
...
//implementation of converter methods
}
当然,阅读BalusC的宝贵Communication in JSF 2.0也会对这个问题有所了解。
还值得一提的是,如果转换器bean不应该保持任何状态,那么转换器bean的范围可能会更改为,例如,应用程序或会话。