I know this post is a bit old but a solution may be useful to others.
The default converter of Struts does not seem to work properly. The field error even occurs with readonly fields populated from the action.
I resolved it by defining my own converter:
Create the converter class (using the date format you need):
public class StringToDateTimeConverter extends StrutsTypeConverter {
// WARNING not safe in multi-threaded environments
private static final DateFormat DATETIME_FORMAT = new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss");
public Object convertFromString(Map context, String[] strings, Class toClass) {
if (strings == null || strings.length == 0 || strings[0].trim().length() == 0) {
return null;
}
try {
return DATETIME_FORMAT.parse(strings[0]);
} catch (ParseException e) {
throw new TypeConversionException("Unable to convert given object to date: " + strings[0]);
}
}
public String convertToString(Map context, Object date) {
if (date != null && date instanceof Date) {
return DATETIME_FORMAT.format(date);
} else {
return null;
}
}
}
Put the conversion annotation on the property setter (or use a conversion.properties file)
@Conversion()
public class MyEditAction {
// ...
@TypeConversion(converter="my.app.common.converter.StringToDateTimeConverter")
public void setUploadedDate(Date uploadedDate) {
this.uploadedDate = uploadedDate;
}
In my case I did not need to edit it but wanted to specify the format in the jsp.
I used an additional hidden field to keep the original value (another alternative would have been the use of Preparable interface):
<s:textfield name="uploadedDateDisplay" value="%{getText('format.datetimesecond',{uploadedDate})}" size="70" disabled="true"/>
<s:hidden name="uploadedDate" />
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…