OmniFaces @Param无法使用转换器来设置基本属性

时间:2016-06-16 11:55:06

标签: jsf converter cdi omnifaces param

@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>

1 个答案:

答案 0 :(得分:2)

这个问题有三个方面:

  1. CDI本身不支持注入原始默认值(需要自定义生产者)。
  2. @Param从未支持原语(因为,实践很差)。
  3. 当完全没有请求参数时,永远不会调用JSF转换器。
  4. 为了解决1和2,我创建了issue 266,我将在2.4决赛之前完成这项工作。

    目前,只需使用Integer代替int。不使用基元作为模型属性也被认为是更好的做法,因为您可以使用null来区分“值从未提交”,“值已提交,但为空”。

    此外,JSF转换器从未被用作“默认值提供者”。当请求参数完全不存在时,<f:viewParam>情况也永远不会触发转换器。因此它“有效”实际上并非如此。设置0的效果只是EL强制的结果,而不涉及转换器。当您完全从案例中删除转换器时,可以证明完全相同的问题。