Uploaded image for project: 'Tapestry 5'
  1. Tapestry 5
  2. TAP5-2255

Form and BeanEditForm differ in JSR-303 detection

    XMLWordPrintableJSON

Details

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

      Attachments

        Activity

          People

            Unassigned Unassigned
            geoffcallender Geoff Callender
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated: