从外部 API 播放模型对象

我是使用Java的Play 2 Framework v. 2.1.1的新手,我正在寻找在不复制代码的情况下执行以下操作的最佳方法。

为了简化,我有一个使用外部API的Play 2后台。我不管理此 API,但我调用 REST 服务通过 API 执行操作。

此 API 的对象与 Play 2 模型对象完全相同。但我不想复制 api 对象来添加 Play 验证和其他注释。

有没有办法使用配置文件添加这种类型的行为?例如,我正在考虑像Hibernate hbm这样的东西。

例如:

非托管 api 中的对象:(为简单起见,我省略了 getter 和 setter)

public class Entity{
    public String field1;
    public String field2;
}

我想避免的对象:(为了简单起见,我省略了 getter 和 setter)

public class Entity1{

    @Required
    @NonEmpty
    @MinLength(3)
    public String field1;

    @Required
    @NonEmpty
    public String field2;
}

配置示例:(我需要这样的东西)

<class name="Entity1">
    <property name="field1" >
        <required/>
        <nonEmpty/>
        <minLength value="3"/>
    </property>
    <property name="field2" >
        <required/>
        <nonEmpty/>
    </property>
</class>

使用注释似乎比使用xml或任何其他配置文件更好,所以我不一定想使用配置文件,我对解决此问题的任何建议持开放态度。

谢谢


答案 1

我看不出在非类型安全描述符(如XML)中复制API模型比使用类型安全语言更好。此外,我不想将我的模型和应用程序耦合到我控制下的API中的模型。

我认为在Java / Scala中复制模型并使用像推土机这样的简单bean复印机在两者之间移动要好得多。


答案 2

一个问题是 ebean 作为持久性提供者 - 在 ebean 中,没有办法外部化 Bean 持久性配置,因为它可以在休眠状态下实现(sql 查询除外)。是否可以切换持久性提供程序?游戏似乎允许这样做。

由于您写道,您无法修改实体源代码,并且不想复制源代码,因此我看到的唯一其他可能性是字节码增强。

您需要的是一个库,它允许您在 xml 文件中外部化批注。该库将使用工具api,在jvm statup上读取xml文件并修改每个列出的类的字节码,以便在运行时向类和字段添加注释。

此方法存在两个问题:

  1. 没有这样的库(至少我找不到它)
  2. Play和EBean使用自己的代理/类加载器,以便允许热部署和持久性

第一个问题是简单而有趣的部分,例如,请参阅 https://today.java.net/pub/a/today/2008/04/24/add-logging-at-class-load-time-with-instrumentation.html。使用javaassist,可以很容易地向类和字段添加注释。从 xml 到批注的映射是直截了当的。这将是一个不错的开源项目。

第二个问题看起来要困难得多,因为您必须安装注释代理,以便它在播放之前执行,并且 ebean 开始解析注释。


推荐