2011-03-22 19 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