首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当服务在自动发现包中时,无法使用tynamo-resteasy保持实体

当服务在自动发现包中时,无法使用tynamo-resteasy保持实体
EN

Stack Overflow用户
提问于 2013-01-21 03:27:28
回答 2查看 386关注 0票数 1

在我发现tynamo和resteasy集成的过程中,我面临着一个保存数据的问题,我部分地解决了这个问题(所以我将部分地分享它;)。用户指南在这里:http://docs.codehaus.org/display/TYNAMO/tapestry-resteasy+guide

我写了一个rest服务,允许在我的系统用户中注册“用户”:

代码语言:javascript
复制
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();
    }

对数据库的访问工作得很好(我让我的用户回来了,在日志中使用了一个saw INSERT INTO命令),但是这个服务永远不会持久化任何东西。事务似乎从未提交过。

我使用的是tapestry-model-hibernate和tapestry-resteasy的0.3.0版本:

代码语言:javascript
复制
<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>

请看我上面的回答,如果你找到更好的方法,请告诉我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-21 03:27:28

根据这个线程:http://osdir.com/ml/java-tynamo-user/2012-04/msg00005.html,这只是一个提交问题:)。

在标准上下文中,事务由调用服务的页面处理。在REST方法中,这项工作应该由服务本身完成。

实际上,这个想法是把你自动发现的REST服务变成一个真正的tapestry IOC服务。

1-将其从自动发现移开

将其移动到服务包中(或允许Tapestry绑定但不在rest自动发现包中的任何人):

在这篇文章中,

2-提取接口

提取接口,并将注释放在它+ CommitAfter上您想要处理事务的位置。

代码语言:javascript
复制
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);
}

删除实现上的批注

代码语言:javascript
复制
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-将其作为单例资源贡献

代码语言:javascript
复制
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-告知注解方法它们是事务型的

代码语言:javascript
复制
public class AppModule {

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

        advisor.addTransactionCommitAdvice(receiver);
    }

如果你更喜欢使用JPATransactionAdvision而不是Hibernate,你可以添加另一个依赖:

代码语言:javascript
复制
    <dependency>
        <groupId>org.tynamo</groupId>
        <artifactId>tapestry-jpa-core</artifactId>
        <version>2.0.1</version>
    </dependency>

5-结论

这个解决方案对我来说很有效,但据我所知,这实际上是唯一的方法。

Alejandro >如果你读过这几行,请告诉我是否有另一种(最短的)方法,我是对的:)

票数 2
EN

Stack Overflow用户

发布于 2016-07-13 16:31:59

您可以使用HibernateSessionManager实现(在tapestry-hibernate依赖中给出)来获取会话并立即提交数据,如下所示:

代码语言:javascript
复制
@Inject 
HibernateSessionManager hibernateSessionManager;

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

在这里,您不能关闭会话。因为会话是共享的,如果你试图关闭会话,你可能会得到类似“休眠会话已关闭”的异常。

另外,事务在这里是共享的,所以您只能使用hibernateSessionManager中给出的commit()函数提交事务,而不知道当前的事务。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14428364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档