@Inject @Param(converter = "#{pageConverter}") // or "pageConverter"
private int page;
@Named
@ApplicationScoped
public class PageConverter implements Converter
When using OmniFaces @Param on page, I get an exception
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)
...
My converter is supposed to take care of that, but getAsObject is never called.
This works:
<f:metadata>
<f:viewParam name="page" value="#{bean.page}">
<f:converter binding="#{pageConverter}"/>
</f:viewParam>
</f:metadata>
This problem is three-fold:
@Paramhas never supported primitives in first place (because, poor practice).To solve 1 and 2, I have created issue 266 and I will work on that before 2.4 final.
For now, just use
Integerinstead ofint. It's also considered a better practice to not use primitives as model properties, because you can then usenullto distinguish "value is never submitted" from "value is submitted, but is empty".Moreover, JSF converters are never intented as "default value providers". The
<f:viewParam>case would also never have triggered the converter when the request parameter is entirely absent. So that it "works" is actually not true. The effect of0being set is just result of EL coercion, which didn't involve the converter. Exactly the same problem is demonstrable when you entirely remove the converter from your case.