Primefaces orderlist自定义转换器在ajax回发中提交错误的字符串表示形式

Primefaces orderlist自定义转换器在ajax回发中提交错误的字符串表示形式,primefaces,jsf-2.2,Primefaces,Jsf 2.2,我需要重新排列列表中某些数据模型的顺序,因此我使用Primefaces orderlist。facelet是: <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui" xmlns:f="http://java.sun.com/jsf/core"> <h:head> <ti

我需要重新排列列表中某些数据模型的顺序,因此我使用Primefaces orderlist。facelet是:

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:p="http://primefaces.org/ui"
  xmlns:f="http://java.sun.com/jsf/core">
<h:head>
    <title>Facelet Title</title>
</h:head>
<h:body>
    <h:form id="main-form">
        <p:panelGrid id="grid" columns="3">
            <p:outputLabel value="Name" for="label"/> 
            <p:inputText id="label" value="#{sampleBean.obj.name}" />
            <p:message for="label"/>
        </p:panelGrid>
        <br/><p:commandButton value="Add" action="#{sampleBean.addToList()}" update="@form" />
        <br/>
        <p:orderList id="rows" value="#{sampleBean.list}" converter="sample2" 
                     itemValue="#{row}" var="row">
            <p:column>
                #{row.name}
            </p:column>
        </p:orderList>
        <br/><p:commandButton value="Export" action="#{sampleBean.export()}" update="@form" />
    </h:form>
    <p:messages autoUpdate="true"/>
</h:body>
</html>
使用简单的转换器是可以的。但由于我的实际用法有一个灵活的结构,所以对象将是org.bson.Document。以下使用JSON表示的转换器不工作:

@FacesConverter("sample2")
public class Sample2Converter  implements Converter {

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
    SampleModel model = new SampleModel();
    try {
        Document d = Document.parse(value);
        model.setName(d.getString("name"));
    }
    catch (RuntimeException ex) {
        model.setName("exception");
        Logger.getLogger("Sample2Converter").log(Level.SEVERE, null, ex);
    }
    return model;
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
    if (value instanceof SampleModel) {
        SampleModel model = (SampleModel)value;
        return new Document().append("name", model.getName()).append("uname", model.getUname()).toJson();
    }
    else
        return "invalid";
}

}
从Chrome浏览器调试,在ajax发回时,列表正在提交 主要形式:行\值:[对象] 而不是 主要形式:行\值:{“名称”:“苹果”}


我使用的是Mojarra 2.2.12,Primefaces 6.1。

转换为json愚弄了Primefaces脚本。作为一种解决方法,我在自定义转换器中使用base64编码/解码,并解决了这个问题。

正如在另一个问题中所述,逗号在这个组件中可能意味着什么。我看不出有任何理由应该将json字符串作为转换器的“toString”返回。尝试只使用一个非json字段。非json toString方法可以很好地工作。我认为问题在于json字符串愚弄了Primefaces脚本。如果像逗号或大括号这样的字符引起了问题,Primefaces应该透明地转义,或者至少在文档中说明这一点。没有人是完美的。检查来源,看看是否真的是这样。源代码是开放的。如果这确实是原因,在问题列表中提交一个问题,如果你认为应该转义它而不是仅仅记录它,你甚至可以创建一个补丁并提交一个pullrequest,一个逗号并不是问题,我验证了这一点。但是格式良好的JSON字符串是有创意的!恭维您没有检查哪个字符愚弄了组件?似乎只要字符串是有效的JSON,它就会中断。例如{“abc”:“def”}会破坏它,[“abc”,“def”]也会破坏它。但是{},abc不会破坏它。所以可能是“a”会破坏它。不,a“b”c不会破坏它。
public class SampleModel {

private String name;
private String uname;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
    this.uname = name.toUpperCase();
}

public String getUname() {
    return uname;
}

public void setUname(String uname) {
    this.uname = uname;
}
}
@FacesConverter("sample2")
public class Sample2Converter  implements Converter {

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
    SampleModel model = new SampleModel();
    try {
        Document d = Document.parse(value);
        model.setName(d.getString("name"));
    }
    catch (RuntimeException ex) {
        model.setName("exception");
        Logger.getLogger("Sample2Converter").log(Level.SEVERE, null, ex);
    }
    return model;
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
    if (value instanceof SampleModel) {
        SampleModel model = (SampleModel)value;
        return new Document().append("name", model.getName()).append("uname", model.getUname()).toJson();
    }
    else
        return "invalid";
}

}