Omnifaces @Param无法使用转换器来设置原始属性


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

这个问题是三倍:

  1. CDI不本地支持注入原始默认值(需要定制的生产者)。
  2. @Param从来没有首先支持原语(因为做法不佳)。
  3. 当请求参数完全不存在时,JSF转换器永远不会被调用。

要解决1和2,我创建了第266页,我将在2.4最终之前进行工作。

目前,只需使用Integer而不是int即可。这也被认为是一种更好的做法,不使用原语作为模型属性,因为然后您可以使用 null从"价值"中区分"价值永远不会提交"。

此外,JSF转换器永远不会被视为"默认值提供商"。当请求参数完全不存在时,<f:viewParam>情况也永远不会触发转换器。这样它实际上是不正确的。设置0的效果仅仅是El强制的结果,El强制不涉及转换器。当您完全从案件中删除转换器时,完全相同的问题是可以证明的。

最新更新