jsf selectOneMenu转换器获取项目列表作为值

时间:2015-07-10 19:49:00

标签: java jsf jsf-2

我有一个jsf 2选择输入,其中一个转换器连接到selectentries。我的对象有一个id字段,它应该是一个long值。当我的转换器被调用时,它会被整个选择项列表(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个列表。该方法应该返回一个String,如果我返回&#34; 1&#34;然后我在select中的所有值都是一个,所以我知道它在正确的位置使用转换器。为什么这样称呼它?

<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();
    }

1 个答案:

答案 0 :(得分:0)

找到答案,选择需要看起来像这样:

                <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并在select中执行value =#{}。