我有一个枚举,其代码是这样的 -
public enum COSOptionType {
NOTAPPLICABLE,
OPTIONAL,
MANDATORY;
private String[] label = { "Not Applicable", "Optional", "Mandatory"};
@Override
public String toString() {
return label[this.ordinal()];
}
public static COSOptionType getCOSOption(String value) {
int ivalue = Integer.parseInt(value);
switch(ivalue) {
case 0:
return NOTAPPLICABLE;
case 1:
return OPTIONAL;
case 2:
return MANDATORY;
default:
throw new RuntimeException("Should not get this far ever!");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有转换器来转换枚举类型
public class COSEnumConverter implements Converter {
public Object getAsObject(FacesContext context, UIComponent comp, String value) {
return COSOptionType.getCOSOption(value);
}
public String getAsString(FacesContext context, UIComponent comp, Object obj) {
if (obj instanceof String) {
return (String) obj;
}
COSOptionType type = (COSOptionType) obj;
int index = type.ordinal();
return ""+index;
}
}
Run Code Online (Sandbox Code Playgroud)
视图看起来像这样
<h:selectOneMenu value="#{controller.type}" id="smoking">
<f:selectItems value="#{jnyController.choices}" />
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)
这是创建选择的代码
private List<SelectItem> createChoicies() {
List<SelectItem> list = new ArrayList<SelectItem>();
for (COSOptionType cos : COSOptionType.values()) {
SelectItem item = new SelectItem();
item.setLabel(cos.toString());
item.setValue("" + cos.ordinal());
list.add(item);
}
return list;
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会一直抛出"验证错误"?我可以调试,看看转换器工作正常.
NOTE: I am using JSF 1.1
Run Code Online (Sandbox Code Playgroud)
根本原因是转换器返回一个值得满足的COSOptionType对象而不是字符串"" + cos.ordinal()in getAsObject(),因此在现有选项中根本不会出现.
无论如何,这种方法过于复杂,尤其是枚举和转换器.我建议你重新考虑这种方法如下:
Option:
package com.example;
public enum Option {
NOTAPPLICABLE("Not Applicable"),
OPTIONAL("Optional"),
MANDATORY("Mandatory");
private String label;
private Option(String label) {
this.label = label;
}
public String getLabel() {
return label;
}
}
Run Code Online (Sandbox Code Playgroud)
Bean:
package com.example;
import java.util.ArrayList;
import java.util.List;
import javax.faces.model.SelectItem;
public class Bean {
private List<SelectItem> options = new ArrayList<SelectItem>();
private Option option;
public Bean() {
for (Option option : Option.values()) {
options.add(new SelectItem(option, option.getLabel()));
}
}
public void submit() {
System.out.println(option);
}
public List<SelectItem> getOptions() {
return options;
}
public Option getOption() {
return option;
}
public void setOption(Option option) {
this.option = option;
}
}
Run Code Online (Sandbox Code Playgroud)
OptionConverter:
package com.example;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
public class OptionConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
return Option.valueOf(value);
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
return ((Option) value).name();
}
}
Run Code Online (Sandbox Code Playgroud)
faces-config.xml:
<managed-bean>
<managed-bean-name>bean</managed-bean-name>
<managed-bean-class>com.example.Bean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<converter>
<converter-class>com.example.OptionConverter</converter-class>
<converter-for-class>com.example.Option</converter-for-class>
</converter>
Run Code Online (Sandbox Code Playgroud)
JSF页面的相关部分:
<h:form>
<h:selectOneMenu value="#{bean.option}">
<f:selectItems value="#{bean.options}" />
</h:selectOneMenu>
<h:commandButton value="submit" action="#{bean.submit}" />
<h:messages />
</h:form>
Run Code Online (Sandbox Code Playgroud)
没有必要为Enum#ordinal()哪些被认为是邪恶而烦恼.
如果您使用EnumConverter的OptionConverter是带有内置通用的JSF 1.2或更新版本,则完全是多余的,可以安全地删除.
| 归档时间: |
|
| 查看次数: |
4457 次 |
| 最近记录: |