1

Java 開発者として Play Framework 2.1.1 を使い始めたばかりです。

既存のデータベースからいくつかの eBeans を取得しました。RESTful クライアント Web アプリケーションからそれらの Bean を提供および保存するための RESTful アーキテクチャを構築しています。

次の Bean 定義があります。フィードは、アプリケーションのコア オブジェクトです。簡単にするために、ゲッターとセッター、および他の多くの Bean は含めていません。問題を引き起こすものに焦点を当てています。

@Entity
public class Feed extends Model implements Serializable
{
    @Id
    Long feedId;
    ...
    ...
    ...
    @JsonManagedReference("feed-item")
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "feed")
    List<Item> items;
    @JsonManagedReference("feed-userFeed")
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "feed")
    List<UserFeed> userFeeds;
}

@Entity
public class Item extends Model implements Serializable
{
    @Id
    Long itemId;
    ...
    ...
    ...
    Long urlId;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "url_id")
    Url url;
    @Formats.DateTime(pattern = "yyyy-MM-ddThh:mm:ss")
    Timestamp itemPublishedAt;
    @Formats.DateTime(pattern = "yyyy-MM-ddThh:mm:ss")
    Timestamp itemUpdatedAt;
    @Formats.DateTime(pattern = "yyyy-MM-ddThh:mm:ss")
    Timestamp createdAt;
    @Version
    Timestamp updatedAt;
    Long feedId;
    @ManyToOne(fetch = FetchType.LAZY)
    @JsonBackReference("item-feed")
    @JoinColumn(name = "feed_id")
    Feed feed;
    Long urlId;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "url_id")
    Url url;
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "item")
    @JsonManagedReference("item-unseen")
    List<Unseen> unseen;
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "item")
    @JsonManagedReference("item-score")
    List<Score> scores;
}

@Entity
public class User extends Model implements Serializable
{
    @Id
    Long userId;
    ...
    ...
    ...
    @OneToMany
    @JsonManagedReference("user-userFeed")
    List<UserFeed> userFeeds;
    @OneToMany
    @JsonManagedReference("user-userTag")
    List<UserTag> userTags;
    @OneToMany
    @JsonManagedReference("user-unseen")
    List<Unseen> unseen;
    @OneToMany
    @JsonManagedReference("user-score")
    List<Score> scores;
}

@Entity
public class Score extends Model implements Serializable
{
    @Id
    Long scoreId;
    ...
    ...
    ...
    Long itemId;
    @ManyToOne(fetch=FetchType.LAZY)
    @JsonBackReference("score-item")
    @JoinColumn(name = "item_id")
    Item item;
    Long userId;
    @ManyToOne(fetch=FetchType.LAZY)
    @JsonBackReference("score-user")
    @JoinColumn(name = "user_id")
    User user;
}

これが私のフィードコントローラーです:

import me.zenfeed.model.Feed;

import org.codehaus.jackson.JsonNode;

import play.db.ebean.Model;
import play.libs.Json;
import play.mvc.BodyParser;
import play.mvc.Controller;
import play.mvc.Result;

public class FeedController extends Controller
{
    public static Result delete(Long id)
    {
        new Model.Finder<>(Long.class, Feed.class).byId(id).delete();
        return ok();
    }

    /* return a JSON with all of the objects found*/
    public static Result get()
    {
        return ok(Json.toJson(new Model.Finder<>(Long.class, Feed.class).fetch("userFeeds", new FetchConfig().query()).where().eq("userFeeds.userId", Long.parseLong(session("connectedUserId"))).findList()));
    }

    /* accept a JSON with the object to save and return a JSON with the new object*/
    @BodyParser.Of(BodyParser.Json.class)
    public static Result post()
    {
        JsonNode json = request().body().asJson();
        Feed f = Json.fromJson(json, Feed.class);
        f.save();
        return ok(Json.toJson(f));
    }

    /* accept a JSON with the object to save and return a JSON with the new object*/
    @BodyParser.Of(BodyParser.Json.class)
    public static Result put(Long id)
    {
        JsonNode json = request().body().asJson();
        Feed f = Json.fromJson(json, Feed.class);
        f.update(id);
        return ok(Json.toJson(f));
    }
}

これは、いくつかのパラメーターを使用してDBでクエリを作成するために使用するカスタム関数です。

List<Item> l = new Model.Finder<>(Long.class, Item.class)
.select("itemId, feedId, urlId, title, description, content, author, categories, itemPublishedAt, itemUpdatedAt, wordCount, fresh, vector, createdAt, updatedAt")
.fetch("unseen", "itemId", new FetchConfig().query())
.fetch("scores", "score", new FetchConfig().query())
.fetch("feed.userFeeds", "userId", new FetchConfig().query())
.where()
.eq("feed.userFeeds.userId", Long.parseLong(session("connectedUserId")))
.eq("feed.feedId", feedId)
.orderBy("scores.score")
.findList();

助けてほしい問題がいくつかあります。

- このコントローラのメソッド post() を呼び出す POST リクエストを試みると、次の例外が発生します: [RuntimeException: org.codehaus.jackson.map.JsonMappingException: 管理対象/逆参照 'user-score' を処理できません: no型から見つかった後方参照プロパティ [コレクション型; class java.util.List, contains [simple type, class me.zenfeed.model.Score]]] Score モデルに後方参照を正しく入れたと思いますが、理解できません... 私の ebeans は正しいですか? コントローラーに何か問題がありますか? 何かをより良くすることはできますか?

間違ったチュートリアルを見たことがわかりました。@JsonManagedReference と @JsonBackReference の引数は同じでなければなりません。したがって、フィードとアイテムの関係の場合、正しい注釈は @JsonManagedReference("feed-item") と @JsonBackReference("feed-item") です。

  • ご覧のとおり、Timestamp オブジェクトを HTML5 のような形式でフォーマットしようとしましたが、うまくいきませんでした。私はいつもロングナンバーを取得します。Date オブジェクトに変換する必要がありますか? はいの場合、どこですか?
- カスタム関数を使用してクエリを実行すると、select ステートメントから明確に除外したにもかかわらず、URL オブジェクトが入力されます (オブジェクト全体ではなく、URL_ID のみが必要です)。

気になるプロパティの HashMap を手動で生成し、それを Json.toJson() メソッドに渡しました。

ご協力ありがとうございました。

4

0 に答える 0