selectOneMenu 枚举验证错误
selectOneMenu enum validation error
所以我在提交表单时得到 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() 方法,当我 return "none" (就像枚举值命名一样)如果版本属性为 null,JSF 表单实际上是在职的。
问题是我的下拉菜单中的值与枚举值不匹配。
下拉菜单的值是通过以下方法在 myBean 中创建的:
public Version[] getVersionValues(){
return Version.values();
}
toString() 方法将这些值转换为“”、1.3 和 1.4。但是我需要让它工作(看起来)是 none、v1_3 和 v1_4。
我还尝试在 Version.java 中创建自己的 equals 方法,但没有成功。
(等于(字符串)和等于(版本))。
如果您有一个 TObject 后代的值并且您想要在 JSF 页面中处理它,那么您必须通过自定义转换器定义它的外观。
(Java 枚举值也是 类)。
自定义转换器:
@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)
{
//...
}
}
及其用法:
<h:form>
<h:inputText value="#{myBean.myCustomValue}">
<f:converter converterId="myCustomConverter">
</h:inputText>
</h:form>
但是 JSF 包含一个用于枚举的内置转换器。所以你可以像使用原始类型一样使用它们。
示例枚举类型:
public enum MyEnum
{
VALUE1, VALUE2, VALUE3, VALUE4
}
存储枚举值的托管 bean:
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(); }
}
用于演示 MyEnum 基本类型的小面,如用法:
index.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>
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://xmlns.jcp.org/jsf/html">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
The selected value is: #{myManagedBean.selectedMyEnum}
</h:body>
</html>
所以我在提交表单时得到 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() 方法,当我 return "none" (就像枚举值命名一样)如果版本属性为 null,JSF 表单实际上是在职的。 问题是我的下拉菜单中的值与枚举值不匹配。
下拉菜单的值是通过以下方法在 myBean 中创建的:
public Version[] getVersionValues(){
return Version.values();
}
toString() 方法将这些值转换为“”、1.3 和 1.4。但是我需要让它工作(看起来)是 none、v1_3 和 v1_4。 我还尝试在 Version.java 中创建自己的 equals 方法,但没有成功。 (等于(字符串)和等于(版本))。
如果您有一个 TObject 后代的值并且您想要在 JSF 页面中处理它,那么您必须通过自定义转换器定义它的外观。 (Java 枚举值也是 类)。
自定义转换器:
@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)
{
//...
}
}
及其用法:
<h:form>
<h:inputText value="#{myBean.myCustomValue}">
<f:converter converterId="myCustomConverter">
</h:inputText>
</h:form>
但是 JSF 包含一个用于枚举的内置转换器。所以你可以像使用原始类型一样使用它们。
示例枚举类型:
public enum MyEnum
{
VALUE1, VALUE2, VALUE3, VALUE4
}
存储枚举值的托管 bean:
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(); }
}
用于演示 MyEnum 基本类型的小面,如用法:
index.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>
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://xmlns.jcp.org/jsf/html">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
The selected value is: #{myManagedBean.selectedMyEnum}
</h:body>
</html>