[ 
https://issues.apache.org/jira/browse/TAP5-2255?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jochen Kemnade updated TAP5-2255:
---------------------------------
    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:
{code}
@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);
        }

}
{code}
I've contributed type coercers in AppModule:
{code}
    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));
    }
{code}
and I've contributed an editor:
{code}
    public static void 
contributeBeanBlockSource(Configuration<BeanBlockContribution> configuration) {
        configuration.add(new EditBlockContribution("dateMidnight", 
"infra/AppPropertyEditBlocks", "dateMidnight"));
    }
{code}
Here is the editor:
{code}
<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>
{code}
{code}
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);
    }

}
{code}

  was:
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);
    }

}



> Form and BeanEditForm differ in JSR-303 detection
> -------------------------------------------------
>
>                 Key: TAP5-2255
>                 URL: https://issues.apache.org/jira/browse/TAP5-2255
>             Project: Tapestry 5
>          Issue Type: Bug
>          Components: tapestry-beanvalidator, tapestry-core
>    Affects Versions: 5.4
>            Reporter: Geoff Callender
>
> 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:
> {code}
> @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);
>       }
> }
> {code}
> I've contributed type coercers in AppModule:
> {code}
>     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));
>     }
> {code}
> and I've contributed an editor:
> {code}
>     public static void 
> contributeBeanBlockSource(Configuration<BeanBlockContribution> configuration) 
> {
>         configuration.add(new EditBlockContribution("dateMidnight", 
> "infra/AppPropertyEditBlocks", "dateMidnight"));
>     }
> {code}
> Here is the editor:
> {code}
> <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>
> {code}
> {code}
> 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);
>     }
> }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to