2013-05-27 57 views
14

我是播放2框架訴2.1.1與Java和我正在尋找最好的方式來做到以下沒有重複的代碼。從外部API播放模型對象

爲了簡化,我有一個使用外部API的Play 2後臺。我不管理這個API,但是我打電話給REST服務來通過api執行操作。

此API的對象與完全相同播放2模型對象。但我不想複製api對象來添加Play驗證和其他註釋。

有什麼方法可以使用配置文件添加這種類型的行爲?例如,我正在考慮諸如Hibernate hbm的

例如:

在非託管API對象:(I省略getter和setter爲簡單起見)

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

對象,我想避免:(I省略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或任何其他配置文件更好,所以我並不想使用的配置文件,我願意接受任何建議來解決這個問題。

感謝

+0

我不知道你在這裏試圖完成什麼。 Play2 Backoffice是什麼意思?外部API是一個REST API來返回JSON數據嗎? – mor

+0

嗨! Backoffice是一個Web應用程序,它調用REST Services對api執行操作。 –

+0

你能解釋一下如何從API調用中生成一個Entity對象嗎?從這一點來看,您將更容易瞭解如何從Play2的驗證功能中受益。 – mor

回答

0

的一個問題是ebean作爲持久性提供 - 在ebean沒有辦法外部化bean的持久性配置,因爲它是可以在休眠(除了SQL查詢)。持久性提供者的切換是可能的嗎?玩似乎允許。

由於您寫道您無法修改實體源代碼,並且您不想複製源代碼,所以我看到的唯一的另一種可能性是字節碼增強。

你需要的是一個庫,它允許你在xml文件中外部化註釋。這個庫將使用instrumentation api,在jvm statup中讀取xml文件,並修改每個列出的類的字節碼,以便在運行時向類和字段添加註釋。

有兩個問題的方法:

  1. 沒有這樣的庫(至少我找不到它)
  2. 播放和EBean使用自己的代理/類加載器,以使熱部署和持久性

第一個問題是容易和有趣的部分,例如參見https://today.java.net/pub/a/today/2008/04/24/add-logging-at-class-load-time-with-instrumentation.html。使用javaassist可以很容易地向類和字段添加註釋。從xml到註釋的映射是直截了當的。這將是一個不錯的開源項目。

第二個問題看起來更難,因爲您必須安裝您的註釋代理,以便它在播放和ebean開始解析註釋之前執行。

0

我不明白爲什麼不能在你自己的應用中添加註釋,但是如果你有這樣的約束,爲什麼不擴展類,重寫變量,添加註釋,並將其用作EBean模型?

0

Play有動態表單,可以讓您根據鍵值對映射進行驗證。如果驗證是你想要的,你可以將實體的數據複製到地圖並驗證。

1

我看不到如何在非類型安全描述符(如XML)中重複使用API​​模型比使用類型安全語言更好。此外,我不想將我的模型和應用程序耦合到我控制的API中的模型。

我認爲在Java/Scala中複製模型並使用像推土機這樣的簡單bean複製器在兩者之​​間移動要好得多。

0

簡單的答案:如果代碼行相同,也不總是有代碼重複。

Robert C. Martin在他的一次談話中表明瞭這一點:單一的責任原則。有兩種方法可以打破這個原則:一方面,一個代碼片段中的兩個責任另一方面獨立處理一個責任,兩個代碼片段。

代碼重複是一個事物的責任和語義,而不是相同的代碼行(這可能至多是一個代碼重複的指標)。

在你的情況下,責任是分開的:你有一個外部的API和你的代碼。所以沒有代碼重複。