Details
-
Bug
-
Status: Open
-
Major
-
Resolution: Unresolved
-
5.4
-
None
-
None
Description
I have an entity field that the getter and setter convert between types (field is Date, getter and setter convert from/to JodaTime's DateMidnight).
Form detects @NotNull on the field, but BeanEditForm doesn't. BeanEditForm detects @NotNull on the getter, but Form doesn't. So I have to provide @NotNull on the field AND the getter. Shouldn't Form and BeanEditForm behave the same?
For example, a snippet from an entity:
@Entity public class DatesExample implements Serializable { // This JSR-303 validation will be picked up by Form. @NotNull private java.sql.Date aDateMidnight; // This JSR-303 validation will be picked up by BeanEditForm. @NotNull public DateMidnight getADateMidnight() { return JodaTimeUtil.toDateMidnight(aDateMidnight); } public void setADateMidnight(DateMidnight dm) { this.aDateMidnight = JodaTimeUtil.toSQLDate(dm); } }
I've contributed type coercers in AppModule:
public static void contributeTypeCoercer(Configuration<CoercionTuple> configuration) { // From java.util.Date to DateMidnight Coercion<java.util.Date, DateMidnight> toDateMidnight = new Coercion<java.util.Date, DateMidnight>() { public DateMidnight coerce(java.util.Date input) { // TODO - confirm this conversion always works, esp. across timezones return JodaTimeUtil.toDateMidnight(input); } }; configuration.add(new CoercionTuple<>(java.util.Date.class, DateMidnight.class, toDateMidnight)); // From DateMidnight to java.util.Date Coercion<DateMidnight, java.util.Date> fromDateMidnight = new Coercion<DateMidnight, java.util.Date>() { public java.util.Date coerce(DateMidnight input) { // TODO - confirm this conversion always works, esp. across timezones return JodaTimeUtil.toJavaDate(input); } }; configuration.add(new CoercionTuple<>(DateMidnight.class, java.util.Date.class, fromDateMidnight)); }
and I've contributed an editor:
public static void contributeBeanBlockSource(Configuration<BeanBlockContribution> configuration) { configuration.add(new EditBlockContribution("dateMidnight", "infra/AppPropertyEditBlocks", "dateMidnight")); }
Here is the editor:
<t:container xml:space="default" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"> <t:block id="dateMidnight"> <t:label for="dateMidnight"/> <input t:id="dateMidnight" t:type="DateField" value="context.propertyValue" label="prop:context.label" format="prop:dateInputFormat" translate="prop:dateMidnightTranslator" validate="prop:dateMidnightValidator" clientId="prop:context.propertyId" annotationProvider="context"/> </t:block> </t:container>
public class AppPropertyEditBlocks { @Property @Environmental private PropertyEditContext context; @Component private DateField dateMidnight; @Component private DateField localDate; public DateFormat getDateInputFormat() { return new SimpleDateFormat("dd MMMM yyyy"); } public FieldTranslator<?> getDateMidnightTranslator() { return context.getTranslator(dateMidnight); } public FieldValidator<?> getDateMidnightValidator() { return context.getValidator(dateMidnight); } }