1

tynamo と resteasy の統合の発見で、データの保存に関する問題に直面しており、それを部分的に解決しました (そのため、部分的に共有します ;))。ユーザーガイドはこちら: http://docs.codehaus.org/display/TYNAMO/tapestry-resteasy+guide

システム users に「ユーザー」登録を許可する残りのサービスを作成しました。

package com.myorg.mobile.pushup.rest;
//[...]

/**
 * bla blah obfuscated pretty comments.
 * 
 * @author jrrevy
 * 
 */
@Path("/user")
public class UserResource {

    private Session session;

    /**
     * Constructeur du service
     * 
     * @param session
     *            Hibernate session
     */
    public UserResource(Session session) {
        this.session = session;
    }   

    /**
     * Lecture de tous les utilisateurs
     * 
     * @return une liste des utilisateurs existants
     */
    @GET
    @Produces("application/json")
    public List<User> getAllDomains() {
        return session.createCriteria(User.class).list();
    }

    /**
     * Create User.
     * 
     * @param user
     *            user to create
     * @return a Web Response
     */
    @POST
    @PUT
    @Produces({ "application/xml", "application/json" })
    public Response createOrUpdate(User user) {
        session.saveOrUpdate(user);
        return Response.ok().build();
    }

データベースへのアクセスはうまく機能しますが (ユーザーを元に戻し、INSERT INTO コマンドをログに記録します)、このサービスは何も持続しません。トランザクションはコミットされていないようです。

tapestry-model-hibernate と tapestry-resteasy の 0.3.0 バージョンを使用しています:

<dependencies>

    <dependency>
        <groupId>org.tynamo</groupId>
        <artifactId>tapestry-model-hibernate</artifactId>
        <version>0.3.0</version>
    </dependency>


    <dependency>
        <groupId>org.tynamo</groupId>
        <artifactId>tapestry-resteasy</artifactId>
        <version>0.3.0</version>
    </dependency>

</dependencies>

上記の私の回答を参照してください。より良い方法が見つかった場合は教えてください。

4

2 に答える 2

2

このスレッドによると: http://osdir.com/ml/java-tynamo-user/2012-04/msg00005.html、これは単なるコミットの問題です:)。

標準的なコンテキストでは、トランザクションはサービスを呼び出したページによって処理されます。REST アプローチでは、このジョブはサービス自体で実行する必要があります。

実際、このアイデアは、自動検出された REST サービスを実際のタペストリー IOC サービスに変更することです。

1 - 自動検出から遠ざける

それをサービス パッケージ (または、Tapestry バインディングを許可し、残りの自動検出パッケージではない人) に移動します。

2 - インターフェイスの抽出

インターフェイスを抽出し、トランザクションを処理する場所に+ CommitAfter に注釈を付けます。

package com.myorg.mobile.pushup.services.user;

@Path("/user")
public interface IUserResource {

    /**
     * Lecture de tous les utilisateurs
     * 
     * @return une List des utilisateurs existants
     */
    @GET
    @Produces("application/json")
    List<User> getAllDomains();


    /**
     * Méthode d'enregistrement / MAJ d'un utilisateur.
     * 
     * @param user
     *            l'utilisateur à créer
     * @return
     */
    @POST
    @PUT
    @Produces({ "application/xml", "application/json" })
    @Consumes({ "application/xml", "application/json" })
    @CommitAfter
    Response registerOrUpdate(User user);
}

実装時にアノテーションを削除

package com.myorg.mobile.pushup.services.user.impl;

public class HibernateUserResourceImpl implements IUserResource {
    /* (non-Javadoc)
     */

    public List<User> getAllDomains() {

        return session.createCriteria(User.class).list();
    }

    /* (non-Javadoc)
     */

    Response registerOrUpdate(User user);
        session.saveOrUpdate(user);
        return Response.ok().build();
    }

3 - シングルトン リソースとして提供する

public class AppModule {
    public static void bind(ServiceBinder binder) {
        binder.bind(IUserResource.class, HibernateUserResourceImpl.class);
    }

    /**
     * Contributions to the RESTeasy main Application, insert all your RESTeasy
     * singletons services here.
     */
    @Contribute(javax.ws.rs.core.Application.class)
    public static void configureRestResources(Configuration<Object> singletons,
            IUserResource userResource) {
        singletons.add(userResource);
    }

}

4 - メソッドにトランザクションであることを通知する

public class AppModule {

    @Match("*Resource*")
    public static void adviseTransactionally(
            HibernateTransactionAdvisor advisor, MethodAdviceReceiver receiver) {

        advisor.addTransactionCommitAdvice(receiver);
    }

Hibernate の代わりに JPATransactionAdvision を使用する場合は、別の依存関係を追加できます。

    <dependency>
        <groupId>org.tynamo</groupId>
        <artifactId>tapestry-jpa-core</artifactId>
        <version>2.0.1</version>
    </dependency>

5。結論

この解決策は私にとってはうまくいきますが、私が理解している限り、これが実際にそれを行う唯一の方法です。

Alejandro > これらの行を読んだら、別の (最短の) 方法があれば教えてください。私は正しいです :)

于 2013-01-20T19:27:28.060 に答える
1

以下のように、HibernateSessionManager 実装 (タペストリー-休止状態依存関係内で指定) を使用してセッションを取得し、データを即座にコミットできます。

@Inject 
HibernateSessionManager hibernateSessionManager;

public  void saveOrUpdate(MyEntity instance) {
    Session session = hibernateSessionManager.getSession();
    session.saveOrUpdate(instance);
    hibernateSessionManager.commit();
    session.flush();
}

ここでは、セッションを閉じることはできません。セッションは共有されているため、セッションを閉じようとすると、「hibernate session is closed」のような例外が発生する場合があります。

また、トランザクションはここで共有されるため、現在のトランザクションを知らなくても、hibernateSessionManager で指定された commit() 関数を使用してのみトランザクションをコミットできます。

于 2016-07-13T08:31:59.343 に答える