как динамические java-аннотации? - PullRequest
0 голосов
/ 28 сентября 2011

У меня есть пойо, которое зависит от аннотаций.Он имеет предопределенные поля, а также набор, содержащий поля, предоставленные пользователем:

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 - это «универсальный» объект, т. Е. Разработчик (или потребитель) MyPOJO имеет поля, которые не предопределены в MyPOJOи поэтому разработчик должен поместить эти дополнительные поля в атрибут «поля».Проблема возникает из-за того, что каждый объект в полях Set должен иметь свои собственные аннотации, чтобы указать, сохранено ли конкретное поле или доступно для поиска, чтобы оставаться согласованным с предопределенными атрибутами, такими как name.

Я могу думать о двух вариантах:

  1. Для каждого дополнительного поля разработчик должен будет создать анонимный класс, реализующий поле интерфейса, и внутри этого анонимного класса разработчик объявит соответствующие аннотации.

  2. Набор 'fields' содержит сложный объект с именем поля, значением поля и аннотациями, как показано ниже.Я не могу понять, как вызвать конструктор для поля.Приведенный ниже код не компилируется, но он предназначен в качестве псевдокода для обозначения того, что я пытаюсь сделать.

    Поле myfield1 = new Field ("dateofBirth", new Date (), new ArrayList ({Index.сохранен, Index.searchable}); Поле myfield2 = new Field ("модель", "330i", новый ArrayList ({Index.stored});

Нет конструкции для передачианнотации в качестве параметра: новый 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;
  }
}

Меня не особо волнует ни одна из этих опций, и я надеюсь, что кто-то может дать мне несколько указателей

1 Ответ

0 голосов
/ 28 сентября 2011

Если вам нужна расширяемая объектная модель, я бы сказал, что дизайн POJO просто настраивает себя на дополнительную работу, а не на демонстрацию метамодели.

Тем не менее, вы можете иметь клиентов подкласса API MyPOJO и аннотировать свойства, которые они определяют в своих подклассах. Затем вы использовали бы отражение, чтобы просмотреть все свойства JavaBeans получаемых вами объектов и определить аннотации для получателей - аналогично тому, как работает JPA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...