1

I'm using com.sun.codemodel for generating my classes and adding JSR303 annotations. This is working fine, except when I want to add @Pattern.List annotations.

field.annotate(Pattern.class).param("regexp", "some_expression");

This is currently what is generated:

@Pattern(regexp = "first_expression", message = "first.Pattern.message")
@Pattern(regexp = "second_expression", message = "second.Pattern.message")
@Pattern(regexp = "third_expression", message = "third.Pattern.message")

This is what I want to be generated

@Pattern.List({
  @Pattern(regexp = "first_expression", message = "first.Pattern.message")
  @Pattern(regexp = "second_expression", message = "second.Pattern.message")
  @Pattern(regexp = "third_expression", message = "third.Pattern.message")
})

Somebody any idea how this is done?

user2270781
  • 11
  • 1
  • 2

1 Answers1

4

Assuming that you want @PatternList(list = {@Pattern...}) instead you need to use the paramArray() method:

JDefinedClass testme = codeModel._class("Testme");

JAnnotationUse patternListAnnotation = testme.annotate(Pattern.List.class);
JAnnotationArrayMember list = patternListAnnotation.paramArray("value");

list.annotate(Pattern.class).param("regexp", "first_expression").param("message", "first.Pattern.message");
list.annotate(Pattern.class).param("regexp", "second_expression").param("message", "second.Pattern.message");
list.annotate(Pattern.class).param("regexp", "third_expression").param("message", "third.Pattern.message");

Outputs the following:

@Pattern.List({
    @Pattern(regexp = "first_expression", message = "first.Pattern.message"),
    @Pattern(regexp = "second_expression", message = "second.Pattern.message"),
    @Pattern(regexp = "third_expression", message = "third.Pattern.message")
})
public class Testme {
}

This should work the same for fields as hinted in your example code.

John Ericksen
  • 10,995
  • 4
  • 45
  • 75
  • Pattern.List is working fine in Java, your proposed solution is solving my problem, this is what I did:JAnnotationArrayMember fieldPatterns = field.annotate(Pattern.List.class).paramArray("value"); fieldPatterns.annotate(Pattern.class).param("regexp", "first_expression"); fieldPatterns.annotate(Pattern.class).param("regexp", "second_expression"); fieldPatterns.annotate(Pattern.class).param("regexp", "third_expression"); – user2270781 Apr 12 '13 at 05:03
  • Not really anything to share, the Pattern and Pattern.List interfaces are defined in the javax.validation 1.0 API See - javax.validation.constraints.Pattern - javax.validation.constraints.Pattern.List I'm currently using the Hibernate implementation. – user2270781 Apr 15 '13 at 06:06
  • Cool. I have just never come across this particular annotation syntax before. Thanks! – John Ericksen Apr 15 '13 at 15:05