5

我想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将是空的,如果我想注入ManagedBeanConverter我也可以标记它ManagedBean。问题是我想以漂亮的方式来做,我不想寻找一些“奇怪的解决方案”。也许问题出在我的应用程序中?也许还有其他一些好的解决方案来创建必须从数据库获取数据并在转换器中使用的对象?我还想提一下,我更喜欢使用DependencyInjection而不是使用语句创建新对象new(它更容易测试和维护)。有什么建议么?

4

1 回答 1

15

而不是使用@FacesConverter你应该使用@ManagedBean,因为当前 faces 转换器不是有效的注入目标。尽管如此,您可以选择您的转换器作为托管 bean,因此在您的视图中将其称为converter="#{yourConverter}"(通过托管 bean 名称)而不是converter="yourConverter"(通过转换器 id)。

基本用法示例:

@ManagedBean
@RequestScoped
public class YourConverter implements Converter {

    @ManagedProperty...
    ...

    //implementation of converter methods

}

当然,阅读 BalusC在 JSF 2.0 中的无价通信也会对这个问题有所了解。

还值得一提的是,转换器 bean 的范围可能会更改为,例如,应用程序或会话,如果它不应该保持任何状态。

于 2013-03-13T18:35:58.973 回答