java - 带有可编辑数据表的 Primefaces selectManyCheckbox 将空值提交给转换器

标签 java jsf jsf-2 primefaces selectmanycheckbox

我在可编辑数据表中使用 Primefaces selectManyCheckbox like this one .当用户单击编辑按钮时,他可以在文档列中的不同文档之间进行选择。那是我的代码。请注意我使用的转换器:

<p:dataTable id="tbl" styleClass="fixedLayoutTable no-highlight dblclick-edit edit-commit-others"
            value="#{cc.attrs.manager.mg}" var="mg"
             emptyMessage="#{msgs.noManager}" editable="true" widgetVar="tbl">
        <p:column  headerText="Documents">
            <p:cellEditor>
                <f:facet name="output">
                   <h:outputText value="#{msgs.noDocs}" rendered="#{mg.docs.size() == 0}" />
                <h:outputText value="#{mg.docs.toArray()[0].fileName}" rendered="#{mg.docs.size() > 0}" />
            </f:facet>
                <f:facet name="input">
                    <p:selectManyCheckbox id="chkDoc" 
                            value="#{mg.docs}" layout="pageDirection"
                            converter="myConverter" collectionType="java.util.HashSet">
                        <f:selectItems value="#{cc.attrs.manager.docs}"
                            var="d" itemValue="#{d}" itemLabel="#{d.fileName}" />
                    </p:selectManyCheckbox>
                </f:facet>
            </p:cellEditor>
        </p:column>
    </p:dataTable>

在应用程序的另一个选项卡(我们称之为 Tab1)中,用户可以上传一些文档。这些文档已添加到辅助 bean 中的 cc.attrs.manager.docs-List,但还不会持久保存在数据库中。如果用户在 Tab1 中上传一些文档并转到 Tab2(带有数据表的选项卡),他应该能够在所有文档之间进行选择,包括最近添加的文档。所以用户点击编辑按钮,所有的文档都出现在SelectManyCheckbox中。如果用户选择这些文档并单击 ✔-Sign,我的转换器就会被调用。

我关注了this example实现转换器。这是此类的代码片段:

@FacesConverter(value="myConverter")
public class MyConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if (component instanceof PickList) {
            return getAsObject((PickList)component, value);
        } else {
            return SelectItemsUtils.findValueByStringConversion(context, component, value, this);
        }
    }
}

这工作正常,直到用户不检查最近添加的文档。如果他检查其中一个新文档,则 getAsObject- 方法的字符串参数为“null”。有没有人有一些建议,为什么这个参数为空?是因为文档还没有持久化吗?是否可以在不保留 Tab1 中添加的文档的情况下使它正常工作?

最佳答案

而不是您自己的自定义 converter ,试试这个 generic converter 它适用于所有东西。

import java.util.Map;
import java.util.Map.Entry;
import java.util.UUID;
import java.util.WeakHashMap;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

@FacesConverter(value = "entityConverter")
public class EntityConverter implements Converter {

    private static Map<Object, String> entities = new WeakHashMap<Object, String>();

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object entity) {
        synchronized (entities) {
            if (!entities.containsKey(entity)) {
                String uuid = UUID.randomUUID().toString();
                entities.put(entity, uuid);
                return uuid;
            } else {
                return entities.get(entity);
            }
        }
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String uuid) {
        for (Entry<Object, String> entry : entities.entrySet()) {
            if (entry.getValue().equals(uuid)) {
                return entry.getKey();
            }
        }
        return null;
    }

}

关于java - 带有可编辑数据表的 Primefaces selectManyCheckbox 将空值提交给转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20732915/

相关文章:

JSF 2.1 + RichFaces 4 - 分页 dataGrid

jsf - 拦截器不适用于 JSF 托管 bean?

jsf - 如何包含多个 xhtml 页面,这些页面将相同的模板扩展到一个摘要 xhtml 页面中,

java - 我的课出了点问题。我是初学者

java - 我应该在哪里打开/关闭 JSF ManagedBean 中的 JMS 连接?

java - 如何使用 JSF2 处理多态性?

java - JRE 6 不支持漂亮面孔

java - Swing JTextArea 上的文本鼠标悬停弹出窗口?

java - TTS 不受 AudioManager 设置的音量影响

Java:使用弱引用堆栈