com.opensymphony.xwork.util
Class XWorkConverter
java.lang.Object
ognl.DefaultTypeConverter
com.opensymphony.xwork.util.XWorkConverter
- All Implemented Interfaces:
- ognl.TypeConverter
public class XWorkConverter
- extends ognl.DefaultTypeConverter
XWorkConverter is a singleton used by many of the WebWork's Ognl extention points,
such as InstantiatingNullHandler, XWorkListPropertyAccessor etc to do object
conversion.
Type conversion is great for situations where you need to turn a String in to a more complex object. Because the web
is type-agnostic (everything is a string in HTTP), WebWork's type conversion features are very useful. For instance,
if you were prompting a user to enter in coordinates in the form of a string (such as "3, 22"), you could have
WebWork do the conversion both from String to Point and from Point to String.
Using this "point" example, if your action (or another compound object in which you are setting properties on)
has a corresponding ClassName-conversion.properties file, WebWork will use the configured type converters for
conversion to and from strings. So turning "3, 22" in to new Point(3, 22) is done by merely adding the following
entry to ClassName-conversion.properties (Note that the PointConverter should impl the ognl.TypeConverter
interface):
point = com.acme.PointConverter
Your type converter should be sure to check what class type it is being requested to convert. Because it is used
for both to and from strings, you will need to split the conversion method in to two parts: one that turns Strings in
to Points, and one that turns Points in to Strings.
After this is done, you can now reference your point (using <ww:property value="post"/> in JSP or ${point}
in FreeMarker) and it will be printed as "3, 22" again. As such, if you submit this back to an action, it will be
converted back to a Point once again.
In some situations you may wish to apply a type converter globally. This can be done by editing the file
xwork-conversion.properties in the root of your class path (typically WEB-INF/classes) and providing a
property in the form of the class name of the object you wish to convert on the left hand side and the class name of
the type converter on the right hand side. For example, providing a type converter for all Point objects would mean
adding the following entry:
com.acme.Point = com.acme.PointConverter
Type conversion should not be used as a substitute for i18n. It is not recommended to use this feature to print out
properly formatted dates. Rather, you should use the i18n features of WebWork (and consult the JavaDocs for JDK's
MessageFormat object) to see how a properly formatted date should be displayed.
Any error that occurs during type conversion may or may not wish to be reported. For example, reporting that the
input "abc" could not be converted to a number might be important. On the other hand, reporting that an empty string,
"", cannot be converted to a number might not be important - especially in a web environment where it is hard to
distinguish between a user not entering a value vs. entering a blank value.
By default, all conversion errors are reported using the generic i18n key xwork.default.invalid.fieldvalue,
which you can override (the default text is Invalid field value for field "xxx", where xxx is the field name)
in your global i18n resource bundle.
However, sometimes you may wish to override this message on a per-field basis. You can do this by adding an i18n
key associated with just your action (Action.properties) using the pattern invalid.fieldvalue.xxx, where xxx
is the field name.
It is important to know that none of these errors are actually reported directly. Rather, they are added to a map
called conversionErrors in the ActionContext. There are several ways this map can then be accessed and the
errors can be reported accordingly.
- Author:
- Pat Lightbody, Rainer Hermanns, Alexandru Popescu
- See Also:
XWorkBasicConverter
Method Summary |
static java.lang.String |
buildConverterFilename(java.lang.Class clazz)
|
java.lang.Object |
convertValue(java.util.Map map,
java.lang.Object o,
java.lang.Class aClass)
|
java.lang.Object |
convertValue(java.util.Map context,
java.lang.Object target,
java.lang.reflect.Member member,
java.lang.String property,
java.lang.Object value,
java.lang.Class toClass)
Convert value from one form to another. |
static java.lang.String |
getConversionErrorMessage(java.lang.String propertyName,
OgnlValueStack stack)
|
protected java.lang.Object |
getConverter(java.lang.Class clazz,
java.lang.String property)
|
static XWorkConverter |
getInstance()
|
ObjectTypeDeterminer |
getObjectTypeDeterminer()
|
protected void |
handleConversionException(java.util.Map context,
java.lang.String property,
java.lang.Object value,
java.lang.Object object)
|
void |
loadConversionProperties(java.lang.String propsName)
|
ognl.TypeConverter |
lookup(java.lang.Class clazz)
Looks for a TypeConverter in the default mappings. |
ognl.TypeConverter |
lookup(java.lang.String className)
Looks for a TypeConverter in the default mappings. |
void |
registerConverter(java.lang.String className,
ognl.TypeConverter converter)
|
void |
registerConverterNotFound(java.lang.String className)
|
static void |
resetInstance()
|
void |
setDefaultConverter(ognl.TypeConverter defaultTypeConverter)
|
static void |
setInstance(XWorkConverter instance)
|
void |
setObjectTypeDeterminer(ObjectTypeDeterminer determiner)
|
Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
LOG
protected static final org.apache.commons.logging.Log LOG
REPORT_CONVERSION_ERRORS
public static final java.lang.String REPORT_CONVERSION_ERRORS
- See Also:
- Constant Field Values
CONVERSION_PROPERTY_FULLNAME
public static final java.lang.String CONVERSION_PROPERTY_FULLNAME
- See Also:
- Constant Field Values
CONVERSION_ERROR_PROPERTY_PREFIX
public static final java.lang.String CONVERSION_ERROR_PROPERTY_PREFIX
- See Also:
- Constant Field Values
CONVERSION_COLLECTION_PREFIX
public static final java.lang.String CONVERSION_COLLECTION_PREFIX
- See Also:
- Constant Field Values
LAST_BEAN_CLASS_ACCESSED
public static final java.lang.String LAST_BEAN_CLASS_ACCESSED
- See Also:
- Constant Field Values
LAST_BEAN_PROPERTY_ACCESSED
public static final java.lang.String LAST_BEAN_PROPERTY_ACCESSED
- See Also:
- Constant Field Values
XWorkConverter
protected XWorkConverter()
getConversionErrorMessage
public static java.lang.String getConversionErrorMessage(java.lang.String propertyName,
OgnlValueStack stack)
getInstance
public static XWorkConverter getInstance()
setInstance
public static void setInstance(XWorkConverter instance)
buildConverterFilename
public static java.lang.String buildConverterFilename(java.lang.Class clazz)
resetInstance
public static void resetInstance()
setDefaultConverter
public void setDefaultConverter(ognl.TypeConverter defaultTypeConverter)
convertValue
public java.lang.Object convertValue(java.util.Map map,
java.lang.Object o,
java.lang.Class aClass)
- Overrides:
convertValue
in class ognl.DefaultTypeConverter
convertValue
public java.lang.Object convertValue(java.util.Map context,
java.lang.Object target,
java.lang.reflect.Member member,
java.lang.String property,
java.lang.Object value,
java.lang.Class toClass)
- Convert value from one form to another.
Minimum requirement of arguments:
- supplying context, toClass and value
- supplying context, target and value.
- Specified by:
convertValue
in interface ognl.TypeConverter
- Overrides:
convertValue
in class ognl.DefaultTypeConverter
- See Also:
TypeConverter.convertValue(java.util.Map, java.lang.Object, java.lang.reflect.Member, java.lang.String, java.lang.Object, java.lang.Class)
lookup
public ognl.TypeConverter lookup(java.lang.String className)
- Looks for a TypeConverter in the default mappings.
- Parameters:
className
- name of the class the TypeConverter must handle
- Returns:
- a TypeConverter to handle the specified class or null if none can be found
lookup
public ognl.TypeConverter lookup(java.lang.Class clazz)
- Looks for a TypeConverter in the default mappings.
- Parameters:
clazz
- the class the TypeConverter must handle
- Returns:
- a TypeConverter to handle the specified class or null if none can be found
getConverter
protected java.lang.Object getConverter(java.lang.Class clazz,
java.lang.String property)
handleConversionException
protected void handleConversionException(java.util.Map context,
java.lang.String property,
java.lang.Object value,
java.lang.Object object)
registerConverter
public void registerConverter(java.lang.String className,
ognl.TypeConverter converter)
registerConverterNotFound
public void registerConverterNotFound(java.lang.String className)
loadConversionProperties
public void loadConversionProperties(java.lang.String propsName)
throws java.io.IOException
- Throws:
java.io.IOException
getObjectTypeDeterminer
public ObjectTypeDeterminer getObjectTypeDeterminer()
setObjectTypeDeterminer
public void setObjectTypeDeterminer(ObjectTypeDeterminer determiner)
- Parameters:
determiner
-