@Inject @Param(converter = "#{pageConverter}") // or "pageConverter"
private int page;
@Named
@ApplicationScoped
public class PageConverter implements Converter
在page
上使用Omnifaces @Param
时,我得到了一个异常
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>
这个问题是三倍:
- CDI不本地支持注入原始默认值(需要定制的生产者)。
-
@Param
从来没有首先支持原语(因为做法不佳)。 - 当请求参数完全不存在时,JSF转换器永远不会被调用。
要解决1和2,我创建了第266页,我将在2.4最终之前进行工作。
目前,只需使用Integer
而不是int
即可。这也被认为是一种更好的做法,不使用原语作为模型属性,因为然后您可以使用 null
从"价值"中区分"价值永远不会提交"。
此外,JSF转换器永远不会被视为"默认值提供商"。当请求参数完全不存在时,<f:viewParam>
情况也永远不会触发转换器。这样它实际上是不正确的。设置0
的效果仅仅是El强制的结果,El强制不涉及转换器。当您完全从案件中删除转换器时,完全相同的问题是可以证明的。