Primefaces芯片Web组件

时间:2017-03-22 21:25:24

标签: java hibernate jsf primefaces bean-validation

我有一个CRUD,我想更改inputTexArea:

<p:inputTextarea id="tags" value="#{myController.selected.tags}" />

到新的Primefaces 筹码组件:

<p:chips id="tags" value="#{myController.selected.tags}" />

实体类摘录:

@Lob
@Size(max = 2147483647)
@Column(name = "tags")
private String tags;
//GETTER AND SETTER OMITTED

获取方法正常,因为标记按预期显示在字段中:

public List<String> getTags() {
return Arrays.asList(tags.split(","));
}

设置方法不是,因为当我点击“保存”时,会发生异常:

public void setTags(List<String> tags) {
this.tags = String.join(",", tags);
}

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.CharSequence
at org.hibernate.validator.internal.constraintvalidators.SizeValidatorForCharSequence.isValid(SizeValidatorForCharSequence.java:33)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateSingleConstraint(ConstraintTree.java:281)

有人可以帮助我吗?

提前致谢。

ps:我已经向Primefaces团队(https://forum.primefaces.org/viewtopic.php?f=3&t=51091)询问了这个问题,Primefaces的核心开发人员(Thomas Andraschko)指导我去问Hibernate验证团队。

3 个答案:

答案 0 :(得分:4)

似乎Hibernate验证器与您的getter返回List<String>字段的String混淆。试试这个:

public String getTags() {
    return tags;
}

public void setTags(String tags) {
    this.tags = tags;
}

public List<String> getTagsList() {
    return Arrays.asList(tags.split(","));
}

public void setTagsList(List<String> tags) {
    this.tags = String.join(",", tags);
}

然后:

<p:chips id="tags" value="#{myController.selected.tagsList}" />

答案 1 :(得分:1)

p:chips使用列表作为值,为什么不使用它:

private String tags = "aaaa,bbb";

public List<String> getTags() {
    return Arrays.asList(tags.split(","));
}

public void setTags(List<String> tags) {
    this.tags = String.join(",", tags);
}

答案 2 :(得分:1)

如果您没有Java 8但拥有Apache Commons Lang库,则可以使用

StringUtils方法: org.apache.commons.lang.StringUtils.join(tags,“,”)而不是String.join(“,”,tags);