在FacesConverter中使用ManagedBean

时间:2013-03-13 17:55:35

标签: jsf-2 facelets

我想在ManagedBean中使用ConverterManagedBean负责从数据库中获取数据。在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语句创建新对象(它更容易测试和维护)。有什么建议吗?

1 个答案:

答案 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的范围可能会更改为,例如,应用程序或会话。