【问题标题】:Generate constants for class attributes with maven?用maven为类属性生成常量?
【发布时间】:2011-03-23 00:29:05
【问题描述】:

我有一个小的代码生成问题。 我有一个为前端提供 DTO 对象的 EJB3 后端。前端使用可配置的绑定过程将 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 插件。有没有人现在有一种工具可以做这样的事情?

提前致谢

马丁

【问题讨论】:

    标签: java binding maven ejb-3.0


    【解决方案1】:

    修改现有类比创建新类更困难。

    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-plugin 用于编译(编织)方面

    此外,Eclipse 对 AspectJ 有很好的支持,因此您也可以在那里使用它。

    【讨论】:

    • 嗯,ApsectJ 方法听起来很有趣。您的意思是给我的 dto 类添加一些注释,而 AspectJ 会将常量放入我的 DTO 的 .class 文件中?
    • 听起来不错。这正是我一直在寻找的。你能指出 CarAspect 的生成器插件吗?问了谷歌,但一无所获。
    • 对于生成器插件,没有什么(据我所知)可以开箱即用。我可以建议您查看 Hibernate Metamodel Generator(参见上面的链接),而不是生成 java 文件,而是创建一个方面文件。 Metamodel Generator 使用 Java 6 Annotation 处理来检查代码。做类似的事情应该没有那么难。
    • 嗯,我认为 HMG 不是我选择的工具,因为我不想创建实体的方面而是 DTO 类的方面。我们在后端分离了实体和 API dto 类。实体到 DTO 的映射是通过 Apache dozer 完成的。
    • 是的,我明白了。您的插件将需要检查您的 DTO 类以查找需要放入方面的 bean 属性,然后生成方面文件。我的观点是,可以查看 HMG 实现以更好地了解如何编写插件(但不一定要重用任何代码)。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 感谢您的回答。使用 XText 和 DSL 定义 DTO 类的方法听起来不错,但我认为我的同事不会愿意通过 dsl 更改 dto 的整个定义 =)
    猜你喜欢
    • 2016-09-03
    • 2018-03-10
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多