Di seguito è riportato un convertitore inteso a tagliare gli spazi bianchi iniziali e finali e sostituire più spazi tra le parole in una frase o testo con un singolo spazio. Il convertitore è ora modificato per sostituire null
o stringhe vuote con "Non disponibile" (potrebbe essere localizzato dinamicamente, se necessario).Sostituisce stringhe nulle o vuote con un valore specificato durante l'output utilizzando un convertitore JSF
@FacesConverter(forClass = String.class)
public class StringTrimmer implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
return Boolean.TRUE.equals(component.getAttributes().get("skipConverter")) ? value : value == null ? null : value.trim().replaceAll("\\s+", " ");
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
return Boolean.TRUE.equals(component.getAttributes().get("skipConverter")) ? value == null ? null : value.toString() : value == null || ((String) value).trim().length() == 0 ? "Not available" : ((String) value).trim().replaceAll("\\s+", " ");
}
}
Dal convertitori non vengono invocati, quando un valore modello è null
sulla base di the previous question, com.sun.faces.renderkit.html_basic.TextRenderer
è stata estesa con l'intenzione di convertitori invocano, quando un valore di proprietà nel modello associato è null
.
public final class HtmlBasicRenderer extends TextRenderer {
@Override
public String getCurrentValue(FacesContext context, UIComponent component) {
if (component instanceof UIInput) {
Object submittedValue = ((UIInput) component).getSubmittedValue();
if (submittedValue != null) {
return submittedValue.toString();
}
}
return getFormattedValue(context, component, getValue(component));
}
}
Il following test condizionale è stato rimosso in modo che il metodo getFormattedValue()
può essere richiamato, anche se viene rilevato un valore null
.
Object currentObj = getValue(component);
if (currentObj != null) {
currentValue = getFormattedValue(context, component, currentObj);
}
Questo è stato registrato nel faces-config.xml
come segue.
<render-kit>
<renderer>
<component-family>javax.faces.Output</component-family>
<renderer-type>javax.faces.Text</renderer-type>
<renderer-class>com.example.renderer.HtmlBasicRenderer</renderer-class>
</renderer>
</render-kit>
Il convertitore StringTrimmer
non è ancora invocato (getAsString()
), quando un valore di proprietà nel modello di destinazione restituisce null
.
Inserire un test condizionale in EL come #{empty bean.value ? 'Not available' : bean.value}
ovunque in tutta l'applicazione è follia. Qualche suggerimento?
È Mojarra 2.2.12.
Aggiornamento:
valori convertiti sono disponibili, quando una delle istruzioni return all'interno del metodo getFormattedValue()
restituendo una stringa vuota ""
, quando currentValue
è null
, viene modificato per restituire un valore convertito nel call a
javax.faces.convert.Converter.getAsString(FacesContext context, UIComponent component, Object value)
all'interno di tale metodo getFormattedValue()
.
Così, il following,
if(currentValue == null) {
return "";
}
ha bisogno di essere sostituito con,
if (currentValue == null) {
converter = Util.getConverterForClass("".getClass(), context);
return converter == null ? "" : converter.getAsString(context, component, currentValue);
}
(Bisogni suggerimenti).
In quale componente stai provando questo (in quanto si crea come un generico 'forClass = String.class') Se solo nell'outputText, userei un componente SimpleCustom e cerco/sostituisco il d efault jsf o primeFaces uno con questo. – Kukeltje
Fondamentalmente ''. È possibile creare componenti personalizzati per i campi opzionali selezionati, ma è necessario memorizzare con attenzione quali campi possono contenere valori nulli o vuoti. –
Tiny
Beh, il tipo di stato implicito (usando 'forClass = String.class') è per ** ogni ** stringa? Quindi non c'è bisogno di memorizzare le cose allora. Usa sempre il custom '' ;-) –
Kukeltje