2011-03-22 18 views
2

我有一個小代碼生成問題。 我有一個將DTO對象提供給前端的EJB3後端。前端使用可配置的綁定過程將DTO的屬性映射到其表單。 目前他們正在通過在屬性配置中將屬性指定爲字符串來做到這一點。綁定實現使用反射來訪問屬性。 聽起來不錯,但問題在於,每次我們在DTO中更改屬性名稱時,都不會導致前端發生編譯錯誤,因爲它們只有字符串。使用maven爲類屬性生成常量?

我現在正在尋找一種方法來創建一個字符串常量,該類可以被前端用來將屬性映射到它們的窗體,以便他們得到編譯錯誤,如果我在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插件,它能夠這一點,但沒有成功。有沒有人能夠使用可以做這種事情的工具?

在此先感謝

馬丁

回答

0

修改現有課程比創建新課程更困難。

JPA採取了一種有趣的方法來創建CarDTO_類來解決此問題。有關更多詳細信息,請參閱http://www.hibernate.org/subprojects/jpamodelgen.html。這種方法更容易。你可以看看實現代碼生成的hibernate maven插件。

如果你真的想修改現有的類,那麼我會推薦使用類似於Spring Roo的AspectJ,其中方面包含生成的代碼。

編輯(使用AspectJ實施例)

在這種情況下,我們使用AspectJ 類型間聲明,可用於修改現有類。

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

不要實現這個Maven中,你需要

  1. 插件生成CarAspect
  2. 的AspectJ的Maven的插件來編譯(編織)方面

而且Eclipse對AspectJ有很好的支持,所以你也可以在那裏使用它。

+0

來改變整個dtos的定義,ApsectJ方法聽起來很有趣。你的意思是把一些註釋放到我的dto類中,而AspectJ會把這些常量放到我的DTOs的.class文件中? – martin 2011-03-22 16:06:01

+0

添加了AspectJ示例。 – Nr9 2011-03-22 16:31:05

+0

聽起來不錯。這就是我正在尋找的。你能指出CarAspect的發電機插件嗎?問谷歌,但什麼都沒發現。 – martin 2011-03-22 16:49:04

0

我有一個類似的前端的方法來訪問域類一個應用程序,但我有我的域名通過通過Eclipse Xtext實施的DSL,誰可以使用完全建立在一個maven構建也。在xtext發行版中有一個示例Java域DSL項目,它很容易從那裏開始。

這肯定不是一個快速的「只使用Maven插件」的解決方案,但是一旦你進入Xtext就會得到回報,特別是如果你有很多領域類或很多類似的項目。

從我的域名DSL我通過代碼模板和XTEXT發電機項目三類創建:

  • 目標/生成/看MyDSL(總是產生):
    • AbstractDomainClass(在這個文件中,我有我的靜態串的)
  • 的src /主/ JAVA(生成一次):
    • ConcreteDomainClass
  • 的src /測試/ JAVA(生成一次):
    • ConcreteDomainClassTest

在抽象域類我有所有getter和setter及簡單的持久性的東西,在混凝土領域類是更復雜的東西,測試類代表它自己。

+0

感謝您的回答。 XText和DSL定義DTO類的方法聽起來不錯,但我不認爲我的同事願意通過dsl =) – martin 2011-03-23 07:46:57