úterý 20. ledna 2009

Vyšší divčí anotací

Pokud budete v Jave definovat vlastní anotaci, tak asi určitě narazíte na to, že anotace má zvláštní syntaxi a omezení co do objektových typů, které můžete v anotaci použít. To vede k tomu, že ve vlastní anotaci můžete použít i jinou anotaci. Vrchol zápisu aneb to jak může být anotace definovaná jsem zatím viděl v Bean Validation specifikaci (JSR 303). Následující zápis ukazuje jak lze atributy jedné anotace přemapovat na atributy jiné anotace, což považuji za zajímavý případ užití.

@NotNull
@Size
@ConstraintValidator(FrenchZipcodeValidator.class)
@Documented
@Target( { ANNOTATION_TYPE, METHOD, FIELD })
@Retention(RUNTIME)
public @interface FrenchZipcode {
  String message() default "Wrong zipcode";

  Class<?>[] groups() default {};

  @OverridesParameters( {
      @OverridesParameter(constraint = Size.class, parameter = "min"),
      @OverridesParameter(constraint = Size.class, parameter = "max") })
  int size() default 5;

  @OverridesParameter(constraint = Size.class, parameter = "message")
  String sizeMessage() default "{beancheck.zipcode.size}";
}

A účel?

Parameters from composing annotations can be overridden by parameters from the main annotation. The parameter value from the main annotation annotated with @OverridesParameter is applied to the parameter named after OverridesParameter.parameter of the composing constraint of type OverridesParameter. constraint. If not specified, the name of the targeted parameter equals the name of the parameter the @OverridesParameter is on The types of the overridden and overriding parameters must be equals.