Как я могу настроить сеттеры в объектах, сгенерированных Spring Roo DBRE? - PullRequest
1 голос
/ 07 января 2012

Этот вопрос может обнажить мое отсутствие знаний об AspectJ, но здесь все равно идет:)

Я успешно использовал Spring Roo и Database Reverse Engineer для создания нескольких таблиц в новом проекте Roo. Я хотел бы иметь возможность сохранить в Roo аспект Roo-Engineering, не «проталкивая» свои аспекты в простые старые классы Java. Однако у меня возникла проблема с назначением значений полям-членам, определенным в Aspect.

Например, у меня есть класс сущностей RooDbManaged, назовем его X, и Roo сгенерировал аспект: X_Roo_DbManaged. Теперь я хочу настроить установщик для поля «updateDate», чтобы я мог назначить дату текущей в момент сохранения. Итак, я поместил свой пользовательский код в класс X следующим образом:

</p> <pre><code> public void setUpdateDate(Date updateDate) { this.updateDate = new Date(); }

Это заставляет Roo удалить сеттер из аспекта, как я и ожидал, потому что теперь я определил его в X.

Это дает мне ошибку: Поле X.updateDate не отображается

Если я изменю видимость поля в аспекте X_Roo_DbManaged на 'public' (что я бы предпочел не делать), это решит проблему, пока Roo автоматически не сгенерирует аспект, вызывающий повторение ошибки.

Полагаю, я упускаю что-то настолько очевидное, что никто не посчитал целесообразным публиковать сообщения, поскольку мой обычно успешный поиск в Google не смог найти никакого решения для этого!

Я должен добавить, что мой обходной путь - настроить соответствующие методы из X_Roo_Controller, переместив их в XController и назначив дату там с помощью неизмененного установщика. Кажется, это противоречит интуиции, так как мне бы очень хотелось, чтобы updateDate всегда была текущей датой, когда она установлена. Интересно, что сгенерированная Roo аннотация @Temporal (TemporalType.TIMESTAMP) в поле updateDate не предоставляет эту функциональность. Мне бы очень хотелось иметь возможность сообщить Roo с помощью команды Roo, что некоторые поля DBRE должны иметь такое поведение и не должны беспокоиться о том, что по сути является «слесарным делом».

Ответы [ 2 ]

2 голосов
/ 14 февраля 2012

Я предлагаю вам использовать @PrePersist и @PreUpdate вместо взлома сеттеров

public class X {
   @PreUpdate
   public void beforeSaving() {
      this.setUpdateDate(new Date());
   }
}

В противном случае вы все равно можете поместить само поле из X_Roo_DbManaged.aj в X.java файл, но вы потеряетеспособность постепенно реконструировать эту область.

0 голосов
/ 12 июля 2013

Вы можете переместить поле updateDate в X.java, чтобы оно было видимым.

...