public abstract class ValueChangeConverter<T> extends Object implements Converter<T>
By default, JSF converters run on every request, regardless of whether the submitted value has changed or not. In case of conversion against the DB on complex objects which are already stored in the model in a broader scope, such as the view scope, this may result in unnecessarily expensive service/DAO calls. In such case, you'd like to perform the expensive service/DAO call only when the submitted value is really changed as compared to the model value.
This converter offers you a template to do it transparently. To use it, just change your converters from:
public class YourConverter implements Converter<YourEntity> { public YourEntity getAsObject(FacesContext context, UIComponent component, String submittedValue) { // ... } // ... }
to
public class YourConverter extends ValueChangeConverter<YourEntity> { public YourEntity getAsChangedObject(FacesContext context, UIComponent component, String submittedValue) { // ... } // ... }
So, essentially, just replace implements Converter
by extends ValueChangeConverter
and
rename the method from getAsObject
to getAsChangedObject
.
Note: the getAsString
method of your converter doesn't need to be changed.
DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE_PARAM_NAME
Constructor and Description |
---|
ValueChangeConverter() |
Modifier and Type | Method and Description |
---|---|
abstract T |
getAsChangedObject(FacesContext context,
UIComponent component,
String submittedValue)
Use this method instead of
getAsObject(FacesContext, UIComponent, String) if you intend to perform the
conversion only when the submitted value is really changed as compared to the model value. |
T |
getAsObject(FacesContext context,
UIComponent component,
String submittedValue)
If the component is an instance of
EditableValueHolder and the string representation of its old object
value is equal to the submitted value, then immediately return its old object value unchanged. |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
getAsString
public T getAsObject(FacesContext context, UIComponent component, String submittedValue)
EditableValueHolder
and the string representation of its old object
value is equal to the submitted value, then immediately return its old object value unchanged. Otherwise, invoke
getAsChangedObject(FacesContext, UIComponent, String)
which may in turn do the necessary possibly
expensive DAO operations.getAsObject
in interface Converter<T>
ClassCastException
- When T
is of wrong type.public abstract T getAsChangedObject(FacesContext context, UIComponent component, String submittedValue)
getAsObject(FacesContext, UIComponent, String)
if you intend to perform the
conversion only when the submitted value is really changed as compared to the model value.context
- The involved faces context.component
- The involved UI component.submittedValue
- The submitted value.getAsObject(FacesContext, UIComponent, String)
the usual way.Copyright © 2012–2020 OmniFaces. All rights reserved.