Jof*_*rey 2 generics jsf el primefaces jsf-2
起初我得到了一些ClassCastExceptions.当我去了源头时,我发现我的值Map<Integer,Integer>实际上是字符串.
我做了以下实验来检查PrimeFaces的使用是否是我的问题:
<h:form>
<p:spinner value="#{testBean.integer}" />
<h:inputText value="#{testBean.integer}" />
<p:spinner value="#{testBean.mapInt[0]}" />
<h:inputText pt:type="number" value="#{testBean.mapInt[1]}" />
<p:commandButton value="Read Map Values" action="#{testBean.checkTypes}" update="@form" />
<p:messages />
</h:form>
Run Code Online (Sandbox Code Playgroud)
我的TestBean:
@ManagedBean
@ViewScoped
public class TestBean implements Serializable {
private HashMap<Integer, Integer> map;
private Integer integer;
@PostConstruct
public void init() {
map = new HashMap<>();
}
public void checkTypes() {
addMsg(null, "integer - Class: " + integer.getClass().getSimpleName());
for (Object key : map.keySet()) {
Object o = map.get(key);
addMsg(null, "map[" + key.toString() + "] - Class: " + o.getClass().getSimpleName());
}
}
private static void addMsg(String client, String msg) {
FacesContext.getCurrentInstance().addMessage(client, new FacesMessage(msg));
System.out.println("msg [" + client + "]: " + msg);
}
//... getters/setters ...
}
Run Code Online (Sandbox Code Playgroud)
消息显示:
integer - Class: Integer
map[0] - Class: String
map[1] - Class: String
Run Code Online (Sandbox Code Playgroud)
第一个<h:inputText>甚至不需要通过强制执行数字输入.
我猜JSF在内部使用反射将字段的输入字符串转换为正确的类型.如果是这样,那么也许泛型类型擦除允许它把String在那里的Integer应该是.这可能是问题不会发生的原因integer,它是类型Integer,而不是泛型类型.
我对吗?
我的问题是:我怎样才能轻松解决它?
我是JSF的新手,我在寻找解决方案时听说过转换器.我是否必须创建自定义转换器以强制Integer.valueOf(String)对输入字段进行调用?我在哪里可以找到如何做到这一点?有更简单的解决方案吗?
您的具体问题是由Java泛型类型信息的性质仅在编译时出现,因此在运行时完全不存在,并且EL表达式仅在运行时期间进行评估,因此在编译期间不进行评估.在效果中,EL没有看到任何泛型类型信息.
所有EL在运行时看到的基本上都是a Map,而不是a Map<Integer, Integer>.因此,除非您明确指定a,否则ConverterJSF/EL将假定它与提交的值作为HTTP请求参数提交的标准类型相同:a String.
解决方案相对简单:明确指定转换器.对于Integer该类,您可以使用IntegerConverter具有转换器ID的JSF内置javax.faces.Integer.
<p:spinner value="#{testBean.mapInt[0]}" converter="javax.faces.Integer" />
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
885 次 |
| 最近记录: |