14

私は Java でPlay 2 Framework v. 2.1.1を初めて使用し、コードを複製せずに次のことを行う最善の方法を探しています。

簡単にするために、外部 API を使用する Play 2 バックオフィスがあります。私はこの API を管理していませんが、API を介して操作を実行するために REST サービスを呼び出しています。

この API のオブジェクトは、 Play 2モデル オブジェクトとまったく同じです。しかし、API オブジェクトを複製して Play の検証やその他の注釈を追加したくありません。

構成ファイルを使用してこのタイプの動作を追加する方法はありますか? たとえば、Hibernate hbm のようなものを考えています。

例えば:

アンマネージ 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>

注釈を使用することは、xml やその他の構成ファイルを使用するよりも優れているように思われるため、必ずしも構成ファイルを使用する必要はありません。この問題を解決するための提案をお待ちしております。

ありがとう

4

5 に答える 5

1

XML のようなタイプセーフでない記述子で API モデルを複製することが、タイプセーフな言語を使用するよりも優れていることがわかりません。さらに、自分のモデルとアプリケーションを自分の制御下にある API からのモデルに結合したくありません。

Java/Scala でモデルを複製し、dozer のような単純な Bean コピー機を使用して 2 つの間を移動する方がはるかに優れていると思います。

于 2014-09-24T22:34:15.580 に答える
0

簡単な答え: コード行が同じ場合でも、常にコードが重複するとは限りません。

ロバート C. マーティンは、彼の講演の 1 つでこれを示しています。単一の責任ある原則です。この原則を破る方法は 2 つあります。1 つのコード フラグメントに 2 つの責任を持たせる方法と、2 つのコード フラグメントで 1 つの責任を独立して扱う方法です。

コードの重複は問題の責任であり、同じコード行のセマンティクスではありません (せいぜいコードの重複があることの指標である可能性があります)。

あなたの場合、責任は明確に分離されています。外部 API とコードがあります。したがって、コードの重複はありません。

于 2015-05-12T12:57:05.350 に答える
0

1 つの問題は、永続化プロバイダーとしての ebean です。ebean では、休止状態で可能なように、Bean の永続化構成を外部化する方法がありません (SQL クエリを除く)。永続化プロバイダーの切り替えは可能ですか? プレイはそれを許可しているようです。

あなたはエンティティのソース コードを変更することができず、ソースをコピーしたくないと書いているので、私が見る唯一の他の可能性はバイトコードの拡張です。

必要なのは、xml ファイルで注釈を外部化できるライブラリです。このライブラリはインストルメンテーション API を使用し、jvm 起動時に xml ファイルを読み取り、リストされた各クラスのバイトコードを変更して、実行時にクラスとフィールドに注釈を追加します。

このアプローチには 2 つの問題があります。

  1. そのようなライブラリはありません(少なくとも私は見つけられませんでした)
  2. Play と EBean は、ホット デプロイと永続化を可能にするために、独自のエージェント/クラスローダーを使用します。

最初の問題は、簡単で楽しい部分です。 .html . javaassist を使用すると、クラスやフィールドに注釈を簡単に追加できます。xml から注釈へのマッピングは単純です。そして、それは素晴らしいオープンソース プロジェクトになるでしょう。

2 番目の問題は、プレイと ebean がアノテーションの解析を開始する前に実行されるように、アノテーション エージェントをインストールする必要があるため、はるかに難しく見えます。

于 2013-08-02T10:54:25.517 に答える
0

自分のアプリにアノテーションを追加できない理由はよくわかりませんが、そのような制約がある場合は、クラスを拡張し、変数をオーバーライドし、アノテーションを追加して、それを EBean モデルとして使用してみませんか?

于 2014-01-16T10:26:42.170 に答える
0

Play には動的なフォームがあり、キーと値のペアのマップに対して検証できます。検証が必要な場合は、エンティティのデータをマップにコピーして検証できます。

于 2014-01-16T14:06:34.470 に答える