从外部API播放模型对象

时间:2013-05-27 20:44:43

标签: java playframework configuration-files playframework-2.1

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

为了简化,我有一个使用外部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>

使用注释似乎比使用xmls或任何其他配置文件更好,所以我不一定要使用配置文件,我愿意接受任何建议来解决这个问题。

由于

5 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

一个问题是ebean作为持久性提供程序 - 在ebean中,没有办法将bean持久性配置外部化,因为它可能在hibernate中(除了sql查询)。是否可以切换持久性提供程序?玩似乎允许这样做。

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

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

这种方法存在两个问题:

  1. 没有这样的图书馆(至少我找不到)
  2. Play和EBean使用自己的代理/类加载器以允许热部署和持久性
  3. 第一个问题是简单有趣的部分,例如参见https://today.java.net/pub/a/today/2008/04/24/add-logging-at-class-load-time-with-instrumentation.html。使用javaassist,可以轻松地向类和字段添加注释。从xml到注释的映射是直接的。这将是一个很好的开源项目。

    第二个问题看起来要困难得多,因为你必须安装你的注释代理才能在play和ebean开始解析注释之前执行它。

答案 2 :(得分:0)

我不清楚为什么不能在你自己的应用程序中添加注释,但如果你有这样的约束,为什么不直接扩展类,覆盖变量,添加注释,并将其用作EBean模型?

答案 3 :(得分:0)

Play具有动态表单,可让您根据键值对进行验证。如果验证是您想要的,您可以将实体的数据复制到地图并验证。

答案 4 :(得分:0)

简单回答:如果代码行相同,也不总是代码重复。

罗伯特·C·马丁在他的一次会谈中表明了这一点:单一责任原则。有两种方法可以打破这一原则:一方面,一个代码片段中有两个职责,另一方面,一个职责是独立处理的两个代码片段。

代码重复是一个责任和语义,而不是相同的代码行(最多可能是代码重复的指示符)。

在您的情况下,责任明确分开:您有一个外部API和您的代码。所以没有代码重复。