使用maven为类属性生成常量?

时间:2011-03-22 12:39:08

标签: java binding maven ejb-3.0

我有一个小代码生成问题。 我有一个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 :(得分:0)

我有一个使用类似前端方法访问域类的应用程序,但我的域名完全是通过Eclipse Xtext实现的DSL创建的,也可以在maven构建中使用。 xtext发行版中有一个示例Java域DSL项目,它很容易从那里开始。

这肯定不是一个快速的“只使用maven插件”解决方案,但是一旦你进入Xtext它会得到回报,特别是如果你有很多域类或很多类似的项目。

从我的域DSL我通过代码模板和xtext生成器项目创建了三个类:

  • target / generated / mydsl(始终生成):
    • AbstractDomainClass(在此文件中我有我的静态字符串)
  • src / main / java(生成一次):
    • ConcreteDomainClass
  • src / test / java(生成一次):
    • ConcreteDomainClassTest

在抽象域类中,我有所有getter和setter以及简单的持久性内容,在具体的域类中是更复杂的东西,测试类代表它自己。

答案 1 :(得分: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. 的插件
  3. 用于编译(编织)方面的aspectj-maven-plugin
  4. 此外,Eclipse对AspectJ有很好的支持,所以你也可以在那里使用它。