所以我在提交表单时得到Validation Error: Value is not valid
。
我的枚举看起来像这样:
public enum Version {
none, v1_3("1.3"), v1_4("1.4");
private BigDecimal version;
Version(String vers) {
version = new BigDecimal(vers);
}
Version() {
}
public String toString() {
if(version == null){
return " ";
}
else{
return version.toPlainString();
}
}
...
当我尝试提交以下表单时,我收到了上述错误:
<h:form>
<p>
<h:outputText value="Test Version: " />
<h:selectOneMenu binding="#{inputVersionTest}">
<f:selectItems value="#{myBean.getVersionValues()}" />
</h:selectOneMenu>
</p>
<h:commandButton value="Test" type="submit" action="#{myBean.test(inputVersionTest.value)}" />
</h:form>
我在我的枚举中使用了我的toString()方法,当我返回“none”(就像枚举值命名一样)如果version属性为null,则JSF表单实际上正在工作。 问题是我的下拉菜单中的值不会加上枚举值。
下拉菜单的值由myBean中的此方法创建:
public Version[] getVersionValues(){
return Version.values();
}
toString()方法将这些值转换为“”,1.3和1.4。但我需要让它工作(似乎)是没有,v1_3和v1_4。 我也尝试在Version.java中创建自己的equals方法,但它没有用。 (equals(String)和equals(Version))。
答案 0 :(得分:0)
如果你有一个TObject后代的值,并且你想在JSF页面中处理它,那么你必须通过自定义转换器定义它的外观。 (Java枚举值也是类)。
自定义转换器:
$ pip install pyexcel-cli
$ pyexcel transcode your-file-in.xls your-new-file-out.xlsx
及其用法:
@FacesConverter( "myCustomConverter" )
public class MyCustomConverter implements Converter
{
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value)
{
//...
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object
value)
{
//...
}
}
但是JSF包含用于枚举的内置转换器。所以你可以像原始类型一样使用它们。
示例枚举类型:
<h:form>
<h:inputText value="#{myBean.myCustomValue}">
<f:converter converterId="myCustomConverter">
</h:inputText>
</h:form>
托管bean存储枚举值:
public enum MyEnum
{
VALUE1, VALUE2, VALUE3, VALUE4
}
用于演示MyEnum基元类型的facelets,如用法:
的index.xhtml
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
@Named
@SessionScoped
public class MyManagedBean implements Serializable
{
private MyEnum selectedMyEnum;
public MyManagedBean()
{}
public MyEnum getSelectedMyEnum() { return selectedMyEnum; }
public void setSelectedMyEnum( MyEnum selectedMyEnum_ ) { selectedMyEnum = selectedMyEnum_; }
public MyEnum[] getMyEnumValues() { return MyEnum.values(); }
}
done.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:body>
<h:form>
<h:selectOneRadio value="#{myManagedBean.selectedMyEnum}" layout="pageDirection">
<f:selectItems value="#{myManagedBean.myEnumValues}"/>
</h:selectOneRadio>
<h:commandButton value="Submit" action="done"/>
</h:form>
</h:body>
</html>