Java 从外部API播放模型对象

Java 从外部API播放模型对象,java,playframework,configuration-files,playframework-2.1,Java,Playframework,Configuration Files,Playframework 2.1,我在游戏2框架中是新手。2.1.1使用Java,我正在寻找在不重复代码的情况下完成以下操作的最佳方法 为了简化,我有一个使用外部API的Play2后台。我不管理这个API,但我调用REST服务来通过API执行操作 此API的对象与Play 2模型对象完全相同。但我不想复制api对象来添加播放验证和其他注释 有没有办法使用配置文件添加这种行为?例如,我正在考虑类似Hibernate hbm的东西 例如: 非托管api中的对象:(为了简单起见,我省略了getter和setter) 我想要避免的对象:

我在游戏2框架中是新手。2.1.1使用Java,我正在寻找在不重复代码的情况下完成以下操作的最佳方法

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

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

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

例如:

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

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

配置示例:(我需要类似的东西)


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


谢谢

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

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

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

这种方法有两个问题:

  • 没有这样的图书馆(至少我找不到)
  • Play和EBean使用自己的代理/类加载器,以允许热部署和持久化
  • 第一个问题是简单而有趣的部分,例如,参见。使用javaassist可以很容易地向类和字段添加注释。从xml到注释的映射是直截了当的。这将是一个很好的开源项目


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

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

    Play具有动态形式,允许您根据键、值对的映射进行验证。如果验证是您想要的,那么您可以将实体的数据复制到映射并进行验证。

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


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

    简单回答:如果代码行相同,也不总是存在代码复制

    罗伯特·C·马丁在他的一次演讲中展示了这一点:单一责任原则。打破这一原则有两种方法:一方面在一个代码片段中包含两个职责,另一方面一个职责独立处理两个代码片段

    代码重复是一个责任和语义问题,而不是相同的代码行(这最多可能是代码重复的一个指标)


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

    我不确定您在这里想要完成什么。你说的Play2后台是什么意思?外部API是返回json数据的REST API吗?嗨!Backoffice是一个web应用程序,它调用REST服务来通过api执行操作。您能否解释一下如何从api调用生成
    实体
    对象?从这一点上看,你将更容易从Play2的验证功能中获益。你不能创建一个包含两个应用程序共享的值对象的公共库吗?如果这两个应用程序都是我的,可能是我的,但我只能控制web应用程序。api是其他团队提供的,我无法修改它。
    public class Entity{
        public String field1;
        public String field2;
    }
    
    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>