Greetings,
Using Struts2, 2.0.11 and Java 5, and having problems with custom type
conversion when I type invalid data in a field. I want to convert times in
military format (0700, 2205) to equivalent java.util.Date, with the date
fields set to 1-1-1970. I am using the defaultStack, which includes
prepare, params, conversionError, validation, and workflow interceptors in
the standard order.
If I enter valid data, everything works properly and I end up with nice Date
fields. If I enter something invalid (e.g. 1599, 99 isn't a valid minutes
value), the error is detected and reported, but the original text isn't
displayed in the input field. I'm not sure what I did wrong; could someone
please help?
When I type invalid data in a field, the following happens:
* Type conversion fails (good)
* Error is added to the error list (good)
* Workflow interceptor sees the error and returns "input" (good)
* Error appears properly in my <s:fielderror/> section (good)
* Text I originally typed in the field does NOT appear in the text box (not
good)
* I have debug logging on and I see the following lines:
[2008/Mar/19 12:13:00] [DEBUG] (ParametersInterceptor:148) Setting params
someBeanList[0].endTime => [ 1599 ] someBeanList[0].startTime => [ 0700 ]
then a few lines later:
[2008/Mar/19 12:13:00] [DEBUG] (XWorkConverter:278) field-level type
converter for property [endTime] =
[EMAIL PROTECTED]
[2008/Mar/19 12:13:00] [DEBUG] (OgnlValueStack:165) Error setting value
ognl.MethodFailedException: Method "setEndTime" failed for object
[EMAIL PROTECTED] Mar 03 00:00:00 EST
2008,startTime=<null>,endTime=<null>,invEndTime=<null>]
[java.lang.NoSuchMethodException: setEndTime([Ljava.lang.String;)]
at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:823)
at ognl.OgnlRuntime.setMethodValue(OgnlRuntime.java:964)
at
ognl.ObjectPropertyAccessor.setPossibleProperty(ObjectPropertyAccessor.java:75)
at
ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java:131)
at
com.opensymphony.xwork2.util.OgnlValueStack$ObjectAccessor.setProperty(OgnlValueStack.java:68)
at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:1656)
at ognl.ASTProperty.setValueBody(ASTProperty.java:101)
at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:177)
at ognl.SimpleNode.setValue(SimpleNode.java:246)
at ognl.ASTChain.setValueBody(ASTChain.java:172)
at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:177)
at ognl.SimpleNode.setValue(SimpleNode.java:246)
at ognl.Ognl.setValue(Ognl.java:476)
at com.opensymphony.xwork2.util.OgnlUtil.setValue(OgnlUtil.java:186)
... snip ...
I logged the contents of the ActionContext later and see this:
original.property.override={driverDays[0].endTime='1599'}
So it looks like the conversionError interceptor worked properly.
Action class:
private List<SomeBean> someBeanList; // ArrayList
SomeBean class:
private Date startTime;
private Date endTime;
// getters and setters here
SomeBean-conversion.properties:
startTime=com.package.converter.TimeConverter
endTime=com.package.converter.TimeConverter
TimeConverter:
public class TimeConverter extends StrutsTypeConverter {
@SuppressWarnings("unchecked")
@Override
public Object convertFromString(Map context, String[] paramValues, Class
toClass) {
String timeString = paramValues[0];
DateFormat df = getDateFormat();
try {
return df.parse(timeString);
} catch (ParseException pe) {
throw new TypeConversionException(pe);
}
}
@SuppressWarnings("unchecked")
@Override
public String convertToString(Map context, Object objToConvert) {
if (objToConvert == null) {
return ""; //$NON-NLS-1$
}
DateFormat df = getDateFormat();
return df.format((Date)objToConvert);
}
private DateFormat getDateFormat() {
DateFormat df = new SimpleDateFormat("HHmm"); //$NON-NLS-1$
df.setLenient(false);
return df;
}
JSP:
(adapted from Roughley's Starting Struts 2, p.64)
<s:iterator value="someBeanList" status="stat">
<s:text name="startTime" />
<s:textfield name="someBeanList[%{#stat.index}].startTime"
value="%{someBeanList[#stat.index].startTime}" size="4"
maxlength="4"
onkeypress="return numbersonly(this, event)" />
<s:text name="endTime" />
<s:textfield name="someBeanList[%{#stat.index}].endTime"
value="%{someBeanList[#stat.index].endTime}" size="4"
maxlength="4"
onkeypress="return numbersonly(this, event)" />
</s:iterator>
--
View this message in context:
http://www.nabble.com/Type-conversion-OGNL-question-tp16147699p16147699.html
Sent from the Struts - User mailing list archive at Nabble.com.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]