1

POJO/モデル クラスに注釈を付けずに jersey/resteasy を使用して Web サービスを作成する方法を探しています。jooqを使用してモデルクラスを生成すると、データベースに変更が加えられるたびにモデル クラスが生成されます。

私の問題に関連する 2 つのトピックを見つけました: herehere ですが、別の lib/implementation を使用する以外の解決策があるかどうか知りたいです。

任意のヒント?技術?考え?

どうもありがとうございます!

編集:いくつかのコードを追加します。私は「マッシュルーム」と呼ばれるモデル クラスを持っています。これは、mushroom_id、title、description の 3 つのフィールドで構成されています。

次のような JSON 表現が必要です。

{
    mushroom: {
        mushroom_id: 12,
        title: "pied de mouton",
        description: "très bon champignon!"
    }
}

そのために、Resteasy では、次の注釈を付けたマッシュルーム クラスが必要です。

@XmlRootElement(name = "mushroom")
public class Mushroom {
    private Integer mushroomId;
    private String  title;
    private String  description

    // for each field I need a getter
    // with the XmlElement annotations.
    // for 'description' for instance:
    @XmlElement
public String getDescription() {
    return description;
}
}

しかし、テーブル Mushroom で jooq によって生成された Mushroom クラス/エンティティは次のようになります。

@javax.annotation.Generated(value    = { "http://www.jooq.org", "3.2.0" },
                        comments = "This class is generated by jOOQ")
@java.lang.SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class Mushrooms extends org.jooq.impl.TableImpl<com.spanier.db.tables.records.MushroomsRecord> {

private static final long serialVersionUID = -539518621;

/**
 * The singleton instance of <code>public.mushrooms</code>
 */
public static final com.spanier.db.tables.Mushrooms MUSHROOMS = new com.spanier.db.tables.Mushrooms();

/**
 * The class holding records for this type
 */
@Override
public java.lang.Class<com.spanier.db.tables.records.MushroomsRecord> getRecordType() {
    return com.spanier.db.tables.records.MushroomsRecord.class;
}

/**
 * The column <code>public.mushrooms.mushrooms_id</code>. 
 */
public final org.jooq.TableField<com.spanier.db.tables.records.MushroomsRecord, java.lang.Integer> MUSHROOMS_ID = createField("mushrooms_id", org.jooq.impl.SQLDataType.INTEGER.nullable(false).defaulted(true), this);

/**
 * The column <code>public.mushrooms.name</code>. 
 */
public final org.jooq.TableField<com.spanier.db.tables.records.MushroomsRecord, java.lang.String> NAME = createField("name", org.jooq.impl.SQLDataType.CHAR.length(50).nullable(false), this);

/**
 * The column <code>public.mushrooms.description</code>. 
 */
public final org.jooq.TableField<com.spanier.db.tables.records.MushroomsRecord, java.lang.String> DESCRIPTION = createField("description", org.jooq.impl.SQLDataType.VARCHAR, this);

/**
 * Create a <code>public.mushrooms</code> table reference
 */
public Mushrooms() {
    super("mushrooms", com.spanier.db.Public.PUBLIC);
}

/**
 * Create an aliased <code>public.mushrooms</code> table reference
 */
public Mushrooms(java.lang.String alias) {
    super(alias, com.spanier.db.Public.PUBLIC, com.spanier.db.tables.Mushrooms.MUSHROOMS);
}

/**
 * {@inheritDoc}
 */
@Override
public org.jooq.Identity<com.spanier.db.tables.records.MushroomsRecord, java.lang.Integer> getIdentity() {
    return com.spanier.db.Keys.IDENTITY_MUSHROOMS;
}

/**
 * {@inheritDoc}
 */
@Override
public org.jooq.UniqueKey<com.spanier.db.tables.records.MushroomsRecord> getPrimaryKey() {
    return com.spanier.db.Keys.MUSHROOMS_PKEY;
}

/**
 * {@inheritDoc}
 */
@Override
public java.util.List<org.jooq.UniqueKey<com.spanier.db.tables.records.MushroomsRecord>> getKeys() {
    return java.util.Arrays.<org.jooq.UniqueKey<com.spanier.db.tables.records.MushroomsRecord>>asList(com.spanier.db.Keys.MUSHROOMS_PKEY);
}

/**
 * {@inheritDoc}
 */
@Override
public com.spanier.db.tables.Mushrooms as(java.lang.String alias) {
    return new com.spanier.db.tables.Mushrooms(alias);
}
}

ご覧のように、jooq によって生成されたクラスは次のとおりです。きのこテーブル 注釈 (json 表現の注釈) を失い、jooq クラスを再度編集する必要があります。

そのため、マッシュルームで生成されたクラスの Resteasy アノテーション (json 表現) を別のクラス/別のファイルに追加する方法を探しています。

4

3 に答える 3

0

最初の注意: 永続クラスをデータ転送オブジェクトから常に分離する必要があります。これにより、Web サービス契約に影響を与えることなく、アプリケーションを任意のデータベース システムに適用できます。

2 番目の注意: 実際の DTO を使用すると、これらの DTO クラスに独自の注釈を追加したり、Web サービスのデータの戻り値の型を指定することでオブジェクトを自動的に JSON 形式に変換できるため、注釈を追加しなくてもかまいません。

于 2013-11-30T15:39:30.350 に答える
0

これらのオプションはjOOQ 3.2でのみ表示されます。

1. 独自のコード ジェネレーターを作成する

これは、カスタム コード セクションに関するマニュアルのセクションに部分的に記載されています。あなたの場合、POJO の生成を完全に書き直す (または追加の POJO を生成する) 必要があるかもしれません。

2. POJO を手動で記述して、POJO をより細かく制御する

各 JSON データ構造を完全に制御したい場合、これは長期的にはより良いオプションかもしれません。jOOQ DefaultRecordMapper(たとえば で使用されるResultQuery.fetchInto(Class)) は、引き続きそれらにマッピングできる可能性があります。

3. POJO を手動で作成し、独自の POJO を作成するRecordMapperProvider

JSON データ構造がデータベース モデルと大きく異なる場合は、独自のコードを記述して、jOOQ のデフォルトの動作のほとんどをオーバーライドすることを検討してください。RecordMapperProvider

于 2013-11-30T15:11:19.660 に答える
0

私はジャージーでこれと似たようなことをしました。mixin 機能を使用して、外部インターフェイスを作成し、mixin を jersey に登録できます。これが、シリアライゼーションなどを外部 pojo に追加することを回避する方法でした。

ソース コードを制御できないプロパティを無視するように jackson に指示するにはどうすればよいですか?

@Pathところで、注釈を使用してリソース クラスを作成する必要があります。これを回避する方法がわかりません。注釈を追加せずに pojo オブジェクトにシリアル化パラメーターを追加しようとしていると仮定しています。この場合、ミックスインがおそらく最も最適なソリューションです。

于 2013-11-04T15:38:40.027 に答える