@Inject @Param(converter = "#{pageConverter}") // or "pageConverter"
private int page;
@Named
@ApplicationScoped
public class PageConverter implements Converter
在@Param
上使用OmniFaces page
时,我收到异常
java.lang.IllegalArgumentException: Can not set int field com.example.Bean.page to null value
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at sun.reflect.UnsafeIntegerFieldAccessorImpl.set(UnsafeIntegerFieldAccessorImpl.java:80)
at java.lang.reflect.Field.set(Field.java:758)
at org.jboss.weld.injection.FieldInjectionPoint.inject(FieldInjectionPoint.java:94)
...
我的转换器应该照顾它,但永远不会调用getAsObject
。
这有效:
<f:metadata>
<f:viewParam name="page" value="#{bean.page}">
<f:converter binding="#{pageConverter}"/>
</f:viewParam>
</f:metadata>
答案 0 :(得分:2)
这个问题有三个方面:
@Param
从未支持原语(因为,实践很差)。为了解决1和2,我创建了issue 266,我将在2.4决赛之前完成这项工作。
目前,只需使用Integer
代替int
。不使用基元作为模型属性也被认为是更好的做法,因为您可以使用null
来区分“值从未提交”,“值已提交,但为空”。
此外,JSF转换器从未被用作“默认值提供者”。当请求参数完全不存在时,<f:viewParam>
情况也永远不会触发转换器。因此它“有效”实际上并非如此。设置0
的效果只是EL强制的结果,而不涉及转换器。当您完全从案例中删除转换器时,可以证明完全相同的问题。