【问题标题】:jsf selectOneMenu converter gets list of items as value [duplicate]jsf selectOneMenu转换器获取项目列表作为值[重复]
【发布时间】:2015-07-10 19:48:59
【问题描述】:

我有一个 jsf 2 选择输入,带有一个与选择条目绑定的转换器。我的对象有一个很长的 id 字段,应该是值。当我的转换器被调用时,它会使用整个选择项列表 (List<SimpleEntityGroup>) 而不是 SimpleEntityGroup 调用,因此我可以返回组的 .getId()

调试输出为:

转换成字符串

[SimpleEntityGroup [id=1, name=Group 1], SimpleEntityGroup [id=2, name=Group 2], SimpleEntityGroup [id=3, name=Group 3]]

我希望每次使用一个 SimpleEntityGroup 调用该方法 3 次,而不是一次将所有 3 个作为列表。该方法应该返回一个字符串,如果我返回“1”,那么我在选择中的所有值都是一个,所以我知道它在正确的位置使用转换器。为什么会这样称呼它?

<h:selectOneMenu value="#{simpleEntityBacking.simpleEntity.group}" converter="SimpleEntityGroupConverter">
    <f:selectItems value="#{simpleEntityBacking.groups}" var="c"
        itemLabel="#{c.name}" itemValue="#{c.id}" />
</h:selectOneMenu>

这是我的支持 bean - getter 和 setter,全部省略:

public class SimpleEntityBacking {
    private static final Logger L = Logger.getLogger(SimpleEntityBacking.class);

    @ManagedProperty(value="#{simpleEntity}")
    private SimpleEntity simpleEntity;
    
    @ManagedProperty(value="#{groups}")
    private List<SimpleEntityGroup> groups;
    
    @EJB
    private SimpleEntityDao ed;
    
    /**
     * 
     */
    public SimpleEntityBacking() {
        
    }

这是我的转换器:

/* (non-Javadoc)
     * @see javax.faces.convert.Converter#getAsObject(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.String)
     */
    @Override
    public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
        return ed.getGroupById(new Long(arg2));
    }

    /* (non-Javadoc)
     * @see javax.faces.convert.Converter#getAsString(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)
     */
    @Override
    public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
        L.debug("Converting to String");
        L.debug(arg2);
        SimpleEntityGroup g = (SimpleEntityGroup) arg2;
        return g.getId().toString();
    }

【问题讨论】:

    标签: java jsf jsf-2


    【解决方案1】:

    找到答案,选择需要如下所示:

                    <h:selectOneMenu value="#{simpleEntityBacking.simpleEntity.group}" converter="#{simpleEntityGroupConverter}">
                        <f:selectItems value="#{simpleEntityBacking.groups}" var="c"
                            itemLabel="#{c.name}" />
                    </h:selectOneMenu>
    

    注意转换器周围有一个#{},并且没有指定 itemValue。

    现在,转换器必须如下所示:

    @ManagedBean
    @ApplicationScoped
    public class SimpleEntityGroupConverter implements Converter {
        private static final Logger L = Logger.getLogger(SimpleEntityGroupConverter.class);
    
        @EJB
        private SimpleEntityDao ed;
    

    该类的 JSF 转换器注解不允许 EJB 注入,因此您必须注解为托管 bean 并在选择中执行 value=#{}。

    【讨论】:

      猜你喜欢
      • 2012-08-25
      • 2012-12-06
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多