开发者

'dynamic'-like java annotations?

开发者 https://www.devze.com 2023-04-08 20:59 出处:网络
I have a pojo that is dependent on annotations. It has predefined fields as well as a Set that contains user provided fields:

I have a pojo that is dependent on annotations. It has predefined fields as well as a Set that contains user provided fields:

public class MyPOJO implements Document {

  private String id;
  private LocalString name;
  private LocalString desc;
  private List<Field> fields;

  public MyPOJO(final String id,
                          final LocalString name,
                          final LocalString desc,
                          final List<Field> fields) {
    this.id = id;
    this.name = name;
    this.desc = desc;
    this.fields = fields;
  }

  public String getId() {
    return id;
  }

  @Indexed(searchable = false, stored = true)
  public LocalString getName() {
    return name;
  }

  @Indexed(searchable = true)
  public LocalString getDescription() {
    return desc;
  }

  public List<Field> getFields() {
    return fields;
  }

}

MyPOJO is a 'generic' object, ie, the developer (or consumer) of MyPOJO has fields that are not predefined in MyPOJO and therefore the developer needs to place these additional fields the in attribute 'fields'. The problem arises from the fact that each object in the Set fields needs to have its own annotations to indicate whether the particular field is either stored or searchable in order to remain consistent with the predefined attributes, such as name.

I can think of two options:

  1. For each additional field, the developer will have to create an anonymous class implementing the interface Field and inside this anonymous class, the developer will declare the applicable annotations.

  2. the Set 'fields' contains a complex object of fieldname, fieldvalue and annotations as shown below. I can't figure out how to invoke the constructor for Field. The below code does not compile but it is intended as pseudo-code to signify what I am trying to do.

    Field myfield1 = new Field("dateofBirth", new Date(), new ArrayList({Index.stored, Index.searchable}); Field myfield2 = new Field("model", "330i", new ArrayList({Index.stored});

There is no construct to pass anno开发者_运维技巧tations as a parameter: new ArrayList({Index.stored}.

public class Field  {

  private String name;
  private Object value;
  Collection<Annotation> annotations;

  public Field(final String name, final Object value, Collection<Annotation> annotations;) {
    this.name = name;
    this.value = value;
    this.annotations = Collections.unmodifiableCollection(annotations);
  }

  public String getName() {
    return name;
  }

  public Object getValue() {
    return value;
  }
}

I'm not particularly excited with either option and hoping someone can give me some pointers


If you need an extensible object model, I'd say a POJO design is just setting yourself up for extra work as opposed to exposing a metamodel.

That said, what you could do is have clients of the API subclass MyPOJO, and annotate the properties they define in their subclasses. You would then use reflection to go through all JavaBeans properties of the objects you're receiving and determine the annotations on the getters - similarly to how JPA works.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号