jsf-2 - selectOneMenu 具有复杂的对象,是否需要转换器?

标签 jsf-2 converters selectonemenu

<h:selectOneMenu> 是否需要转换器?或<p:selectOneMenu>以任意用户创建的类作为其值?我的意思是,下面的代码应该在没有转换器的情况下工作吗?

<p:selectOneMenu value="#{bean.language}">
    <f:selectItems value="#{bean.allLanguages}" />
</p:selectOneMenu>

@Named(value = "bean")
@ConversationScoped
public class Bean {

    private Language language; // appropriate getter and setter are present

    public List<SelectItem> getAllLanguages() {
        // populates a list of select items with Strings as item labels and Languages as item values
    }

}

我有一个类似的代码,带有 enum作为类型(语言)并且它工作得很好。但是当我用普通的 java 类替换该类型时,出现转换错误。

最佳答案

这里需要一个转换器,因为 JSF 默认采用字符串,这就是您编码的方式。 JSF 不知道如何将伪实体转换为字符串,反之亦然。

一些注意事项:

1.您的 getAsString 方法定义实体/POJO 的标识符,而不是 JSF(或其他)选择作为 itemLabel 获取的标识符。

2.您的转换器可以使用这篇臭名昭著的文章深入数据库中寻找真实的实体:

http://balusc.blogspot.de/2011/09/communication-in-jsf-20.html#ConvertingAndValidatingGETRequestParameters

您还可以将 CDI 注释与该“模式”一起使用。

3.您的 value = "bean" 是多余的,选择的 CDI 范围通常是 @ViewScoped。但是,您必须记住,如果不使用 Seam 3 或 Apache MyFaces CODI,CDI @Named + JSF @ViewScoped 就无法协同工作。

关于jsf-2 - selectOneMenu 具有复杂的对象,是否需要转换器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14892680/

相关文章:

jsf - 延迟加载 f :selectItems when opening p:selectOneMenu

java - 如何在 JSF 中关闭浏览器时使 session 无效

jsf-2 - @ManagedProperty 注解返回 null 而不是注入(inject)属性

converters - Spring OAuth2 缺少 DefaultOAuth2Token 转换器

c++ - 如何使用 shedskin 将 python 代码转换为 c++ 代码?

css - PrimeFaces SelectOneMenu 与过滤器宽度不正确

java - 使用 Java 通过 Steam 登录

mysql - 无法在jsf应用程序中将数据插入数据库

java - 在 Spring 中将列表绑定(bind)到复选框

jsf-2 - primefaces selectOneMenu 在应该时不起作用