Gegeben ein <p:selectOneMenu>
wie folgt.
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.
Dieser Konverter muss jetzt explizit mit <f:viewParam>
wie folgt angegeben werden.
Und die zugehörige gemanagte Bean muss wie folgt geändert werden.
%Vor% Dies ist wahrscheinlich ein Versehen in Mojarras Standardimplementierung von UIViewParameter#getStringValueFromModel()
, deren Quelle als Referenz kopiert wird unten:
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
:
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 .
Update : Sie beschlossen, es nicht zu beheben. In jedem Fall gibt es OmniFaces.
Tags und Links jsf jsf-2.2 viewparams