2016-06-16 24 views
1
@Inject @Param(converter = "#{pageConverter}") // or "pageConverter" 
private int page; 

OmniFaces @param versagt Wandler zu verwenden, um eine primitive Eigenschaft festlegen

@Named 
@ApplicationScoped 
public class PageConverter implements Converter 

Wenn OmniFaces @Param auf page verwenden, erhalte ich eine Ausnahme

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) 
    ... 

Mein Konverter darauf achten soll, davon, aber getAsObject wird nie aufgerufen.

Dies funktioniert:

<f:metadata> 
    <f:viewParam name="page" value="#{bean.page}"> 
     <f:converter binding="#{pageConverter}"/> 
    </f:viewParam> 
</f:metadata> 
+0

funktioniert Ihr Konverter, wenn er auf andere Weise verwendet wird? – Kukeltje

+0

Ja, es funktioniert, wenn View Tag – Ced

+0

Omnifaces Version verwendet? – Kukeltje

Antwort

2

Dieses Problem ist dreifach:

  1. CDI nativ unterstützt keine primitive Standardwerte Injektion (customized Hersteller erforderlich).
  2. @Param hat nie Primitive an erster Stelle (weil, schlechte Praxis) unterstützt.
  3. JSF-Konverter werden niemals aufgerufen, wenn der Anforderungsparameter nicht vorhanden ist.

Um 1 und 2 zu lösen, habe ich issue 266 erstellt und ich werde daran arbeiten, bevor 2.4 endgültig.

Jetzt verwenden Sie einfach Integer anstelle von int. Es wird auch als eine bessere Methode angesehen, keine Grundelemente als Modelleigenschaften zu verwenden, da Sie dann null verwenden können, um zu unterscheiden, dass "Wert nie gesendet wurde" von "Wert wird gesendet, ist aber leer".

Darüber hinaus sind JSF-Konverter nie als "Default-Provider" gedacht. Der <f:viewParam> Fall hätte den Konverter auch nie ausgelöst, wenn der Anforderungsparameter vollständig abwesend ist. Dass es "funktioniert" ist eigentlich nicht wahr. Der Effekt von 0, der eingestellt wird, ist nur ein Ergebnis von EL-Zwangsbedingungen, die den Konverter nicht involvierten. Genau das gleiche Problem ist nachweisbar, wenn Sie den Konverter vollständig aus Ihrem Fall entfernen.

+0

Danke und ich entschuldige mich dafür, ein bisschen unhöflich früher zu sein – Ced

+2

Ich habe gerade den Fix festgeschrieben, es ist verfügbar in der heutigen neuesten [2.4-SNAPSHOT] (https://oss.sonatype.org/content/repositories/snapshots/org/omnifaces/omnifaces /2.4-SNAPSHOT). – BalusC

+0

Ich hatte endlich die Möglichkeit, es zu testen und es funktioniert. Gibt es eine Chance, dass du es auf maven hochlädst? – Ced