On Feb 19, 2011, at 2:39 PM, Gunnar Morling wrote: > > a scripting-based approach as described by Hardy is also the first idea which > would come to my mind. > > Maybe @ScriptAssert could even be re-used for this (I also thought about > providing support for @ScriptAssert for property validation btw.). I'd like > this idea as the contract is tightly integrated with the annotated method > (e.g. it would be part of the method's JavaDoc etc.). As down-side there is > the lack of type and refactoring safety. > > Another idea might be to support method-specific constraints similar to > custom class-level constraints which would provide more type safety:
Ideally, I think its best to have a generic method that allow to implement a @ScriptAssert method (list like Class-level validation do today. Though the method proposed bellow is quite interesting. > > public class BookingService { > > @ValidBooking > public Reservation book(Date startDate, Date endDate) { > //... > } > } > > @ValidBooking would be a custom annotation type: > > @Target({ METHOD }) > @Retention(RUNTIME) > @MethodConstraint(validatedBy = {ValidBookingValidator.class}) > public @interface ValidBooking{} > > ValidBookingValidator would be a custom method constraint validator > implementation with a specific isValid() method: > > public class ValidBookingValidator implements MethodValidator<ValidBooking> { > > public void initialize(ValidBooking constraintAnnotation) { > } > > public boolean isValid(Date startDate, Date endDate, > ConstraintValidatorContext constraintContext) { > return startDate.before(endDate); > } > } > > Ideally this type would be generated by an annotation processor or similar. > There might be an isValid() method for each different method signature > annotated with @ValidBooking found by the generator. > > Gunnar > > 2011/2/18 Hardy Ferentschik <hibern...@ferentschik.de> > On Fri, 18 Feb 2011 09:01:16 +0100, Emmanuel Bernard > <emman...@hibernate.org> wrote: > > > Reading the Google design by contract work, I realized that we do not > > cover cross-parameter validation in method-level validation. > > I assume you are talking about cofoja (http://code.google.com/p/cofoja), > right? > > > //We want to make sure departure is after arrival. > > void book(Date arrival, Date departure); > > > > Any idea on ow best to address that? > > Some ideas: > > Introduce an equivalent to class level validators: > > @DateParameterCheck > void book(Date arrival, Date departure); > > @MyMethodValidator could contain a marker annotation so that we know that > we > have a method level validation. At first thought we would have to pass > object arrays > to the validator implementations. This is of course at odds with the type > safety approach > of BV. > Also if the method has a return value it is not directly clear by reading > the code > whether the return value would be validated or the parameters. > > An alternative would be something similar to @ScriptAssert: > > @ParameterCheck("arg[0].before(arg[1])") > void book(Date arrival, Date departure); > > Gunnar already thought about naming parameters using @Named (HV-409), > maybe we could also do > something like: > > @ParameterCheck("arrival.before(departure)") > void book(@Named("arrival") Date arrival, @Named("departure") Date > departure); > > > --Hardy > _______________________________________________ > hibernate-dev mailing list > hibernate-dev@lists.jboss.org > https://lists.jboss.org/mailman/listinfo/hibernate-dev > _______________________________________________ hibernate-dev mailing list hibernate-dev@lists.jboss.org https://lists.jboss.org/mailman/listinfo/hibernate-dev