Java 从外部API播放模型对象
我在游戏2框架中是新手。2.1.1使用Java,我正在寻找在不重复代码的情况下完成以下操作的最佳方法 为了简化,我有一个使用外部API的Play2后台。我不管理这个API,但我调用REST服务来通过API执行操作 此API的对象与Play 2模型对象完全相同。但我不想复制api对象来添加播放验证和其他注释 有没有办法使用配置文件添加这种行为?例如,我正在考虑类似Hibernate hbm的东西 例如: 非托管api中的对象:(为了简单起见,我省略了getter和setter) 我想要避免的对象:(为了简单起见,我省略了getter和setter) 配置示例:(我需要类似的东西)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) 我想要避免的对象:
使用注释似乎比使用xmls或任何其他配置文件更好,所以我不一定要使用配置文件,我愿意接受任何解决此问题的建议
谢谢一个问题是ebean作为持久性提供者-在ebean中,没有办法外部化bean持久性配置,因为它在hibernate中是可能的(除了sql查询)。是否可以切换持久性提供程序?游戏似乎允许这样做 由于您编写了无法修改源代码的实体,并且不想复制源代码,因此我看到的唯一其他可能性是字节码增强 您需要的是一个库,它允许您将注释外部化到xml文件中。这个库将使用instrumentation api,在jvm statup上读取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>