Создать константы для атрибутов класса с помощью Maven - PullRequest
2 голосов
/ 22 марта 2011

У меня небольшой вопрос по генерации кода. У меня есть бэкэнд EJB3, который обслуживает объекты DTO для внешнего интерфейса. Интерфейс использует настраиваемую процедуру привязки для сопоставления атрибутов DTO с их формами. В данный момент они делают это, указывая атрибуты как строки в конфигурации. Реализация привязки использует отражение для доступа к атрибутам. Звучит неплохо, но проблема в том, что каждый раз, когда мы меняем имя атрибута в DTO, это не приведет к ошибке компиляции во внешнем интерфейсе, потому что они имеют только строки.

Сейчас я ищу способ создания строковой константы для каждого атрибута класса, который может использоваться внешним интерфейсом для сопоставления атрибутов с их формами, чтобы они получали ошибки компиляции, если я внес изменения в атрибуты dto. .

Пример, как это:

public class CarDTO {

    private String vendor;
    private String name;


    public String getVendor() {}
    public String getName() {}
    [..]    
}

А так и должно быть:

public class CarDTO {

    public static final String VENDOR = "vendor";
    public static final String NAME = "name";

    private String vendor;
    private String name;


    public String getVendor() {}
    public String getName() {}
    [..]    
}

Я искал плагин maven, способный на это, но безуспешно. Есть ли у кого-нибудь инструмент, который может делать такие вещи?

Заранее спасибо

мартин

Ответы [ 2 ]

0 голосов
/ 22 марта 2011

Изменить существующий класс сложнее, чем создать новый.

JPA применил интересный подход к решению этой проблемы, создав класс CarDTO_.Смотрите http://www.hibernate.org/subprojects/jpamodelgen.html для более подробной информации.Этот подход намного проще.Вы можете взглянуть на плагин hibernate maven, который реализует генерацию кода.

Если вы действительно хотите изменить существующий класс, то я бы рекомендовал использовать AspectJ с подходом, похожим на Spring Roo, где аспект содержит сгенерированныйкод.

Отредактировано (Пример с использованием AspectJ)

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

aspect CarAspect 
{
     public static final String CarDTO.VENDOR = "vendor";
     public static final String CarDTO.NAME = "name";
}

Для реализации этого в maven вам понадобится

  1. плагин для генерации CarAspect
  2. aspectj-maven-plugin дляскомпилируйте (сплетите) аспект

Кроме того, Eclipse имеет хорошую поддержку AspectJ, так что вы можете использовать его и там.

0 голосов
/ 22 марта 2011

У меня есть приложение с аналогичным подходом к внешним интерфейсам для доступа к классам домена, но у меня домен полностью создан с помощью DSL, реализованного с помощью Eclipse Xtext , который также может использоваться в сборке maven.В дистрибутиве xtext есть пример DSL-проекта домена Java, с которого его легко начать.

Это, конечно, не быстрое решение "просто используйте плагин maven", но как только вы попадете в Xtext, оно окупитсяособенно если у вас много классов домена или много похожих проектов.

Из моего домена DSL я создаю с помощью шаблонов кода и проекта генератора xtext три класса:

  • target /сгенерированный / mydsl (генерируется всегда):
    • AbstractDomainClass (в этом файле у меня есть моя статическая строка)
  • src / main / java (генерируется один раз):
    • ConcreteDomainClass
  • src / test / java (генерируется один раз):
    • ConcreteDomainClassTest

ВКласс абстрактного домена У меня есть все методы получения и установки и простые персистентные вещи, в конкретном классе домена более сложные вещи, а тестовый класс сам по себе.

...