includeViewParams = true konvertiert den Nullmodellwert in eine leere Zeichenfolge in der Abfragezeichenfolge

8

Gegeben ein <p:selectOneMenu> wie folgt.

%Vor%

Die entsprechende verwaltete Bean:

%Vor%

Der Parameter% <f:viewParam> ist optional. Auf eine Seite wird beispielsweise wie folgt mit einer URL zugegriffen:

https://localhost:8181/Project-war/private_resources/Test.jsf

Da id ein optionaler Parameter ist, wird ein leerer Parameter an die URL angehängt (wenn eine Sprache von <p:selectOneMenu> geändert wird), falls sie nicht wie folgt geliefert wird.

https://localhost:8181/Project-war/private_resources/Test.jsf?id=

Das sollte nicht passieren. Ein leerer Parameter sollte nicht angehängt werden, wenn er nicht angegeben ist und die URL wie die erste aussehen sollte.

Gibt es eine Möglichkeit zu verhindern, dass ein leerer Parameter an die URL angehängt wird, wenn er nicht übergeben wird?

Dies ist nur dem Konverter zugeordnet, der mit <f:viewParam> - javax.faces.Long angegeben wurde.

Wenn dieser Konverter entfernt wird, werden Parameter nicht an die URL angehängt, falls keine Parameter angegeben werden.

Obwohl das Angeben eines Konverters, wie hier demonstriert, völlig unnötig ist, habe ich Konverter wie unten gezeigt, um ein id zu konvertieren, das durch die URL als ein Abfragezeichenfolgenparameter an eine JPA-Entität übergeben wurde.

%Vor%

Dieser Konverter muss jetzt explizit mit <f:viewParam> wie folgt angegeben werden.

%Vor%

Und die zugehörige gemanagte Bean muss wie folgt geändert werden.

%Vor%     
Tiny 18.05.2014, 18:50
quelle

1 Antwort

7

Dies ist wahrscheinlich ein Versehen in Mojarras Standardimplementierung von UIViewParameter#getStringValueFromModel() , deren Quelle als Referenz kopiert wird unten:

%Vor%

Diese Methode wird für jedes UIViewParameter (die UI-Komponente hinter <f:viewParam> ) beim Erstellen der Abfragezeichenfolge für includeViewParams=true aufgerufen. Wir sehen in der Quelle, dass es den Konverter aufruft, unabhängig davon, ob currentValue ist null oder nicht. Mit anderen Worten, selbst wenn der Modellwert null ist, ruft er immer noch den Konverter damit auf.

Siehe javadoc of Converter#getAsString() Konvertierer sind nach Spezifikation erforderlich, um eine Zeichenfolge der Länge Null zurückzugeben, wenn der Wert null :

ist
  

getAsString

     

...

     

Gibt zurück: eine Zeichenfolge mit der Länge null, wenn der Wert null ist, andernfalls das Ergebnis der Konvertierung

Daher sollten Konverter niemals null auf getAsString() zurückgeben. Sie geben dann eine leere Zeichenfolge zurück. Im Fall von Ansichtsparametern in der Abfragezeichenfolge ist dies höchst unerwünscht. Der Unterschied zwischen einem leeren Zeichenfolgenwert und einer vollständigen Abwesenheit in der Abfragezeichenfolge ist wirklich signifikant.

Ich habe es den Leuten von Mojarra als Problem 3288 gemeldet. Sie sollten dann dieses Problem wie folgt beheben:

%Vor%

In der Zwischenzeit habe ich eine Lösung für OmniFaces bereitgestellt . Die <o:viewParam> wurde um diesen Fix erweitert. Es ist verfügbar nach heutigem 1.8-Snapshot .

%Vor%

Update : Sie beschlossen, es nicht zu beheben. In jedem Fall gibt es OmniFaces.

    
BalusC 22.05.2014, 07:47
quelle

Tags und Links