当前位置: 首页 > 知识库问答 >
问题:

TransactionRequiredException:Jersey+Guice+JPA中没有事务在进行

况鸿雪
2023-03-14

GuiceModule类:

public class GuiceModule extends ServletModule {

@Override
protected void configureServlets() {
  // start the service
  bind(JPAInitializer.class).asEagerSingleton();

  // PersistFilter
  filter("/*").through(PersistFilter.class);

  // jpa + guice
  install(new JpaPersistModule("drone-cloud"));

  // bindings
  bind(UserService.class).to(UserServiceImpl.class);
  bind(TwoFactorAuthenticator.class).to(GoogleAuthenticator.class);
  bind(ImageQueue.class).asEagerSingleton();
  bind(DroneCloudServerHandler.class).asEagerSingleton();
 }
}
import javax.inject.Inject;
import com.google.inject.persist.PersistService;

public class JPAInitializer {
   @Inject
   JPAInitializer(PersistService service) {
      service.start();
   }
}

控制器类:

@Consumes(MediaType.APPLICATION_JSON)
@Path("/mission")
public class MissionController {

   @Inject
   Provider<EntityManager> _em;

   @Path("/new")
   @POST
   @Transactional
   public String newMission(SimpleMission mission) {

      _em.get().persist(mission);
      _em.get().flush();
      _em.get().close();

      return "{ \"mission_id\": \"" + mission.getId() + "\" }";
   }
}

和StackTrace:

我做错了什么?

谢谢

共有1个答案

喻昀
2023-03-14

问题在于MissionController类是由Jersey管理的,而不是由Guice管理的,因此JPalocaltXNInterceptor不会截获它

我通过将与DB相关的代码移到另一个类中来解决它,如下所示:

class MissionController {
    @Inject MissionDao dao;
    ....
}


public class MissionDao {
   @Inject Provider<EntityManager> em;

   @Transactional
   public void save(SimpleMission mission) {
      em.get().persist(mission);
   }
   ...
}
 类似资料:
  • 问题内容: When I call: 我得到标题中提到的异常。 我正在使用Hibernate JPA。 问题答案: 在我自己遇到这个问题并花了几个小时试图解决这个问题之后,我终于找到了一个原因:Spring有一个错误,并且@如果同一类具有用于自动装配的注释,则无法维护带有注释的事务。 一旦从相关服务类中删除了注释,并且在XML配置中声明了一个适当的bean: 问题解决了。

  • 我正在Spring3和Hibernate3中进行产品构建,我已经更新了这个Hibernate5和Spring5。现在我可以部署应用程序了,但是当我尝试与数据库连接时,会得到“javax.persistence.TransactionRequiredException:no transaction is in progress”

  • 我正在自己配置Spring Boot应用程序,以运行两个数据库(两个transactionManager相同)。MariaDB和MongoDb。在@Repository中,我已经用@PersistenceContext使用了@Autowired,注释@Transactional正在正确地使用TransactionManager。但对我来说,最有用的是在@Services层上添加@Transacio

  • 当我尝试使用spring batch中的作业处理器将从csv文件恢复的一些数据持久化到我的数据库中时,控制台中会出现这个错误,对于我的dao来说,我使用的是hibernate 我已经尝试了2种方法,但同样的问题! 错误:javax.persistence.transactionRequiredException:在org.hibernate.internal.sessionimpl.checktr

  • 我有一个JPA web应用程序,其中包含一些针对JPA存储库的集成测试。目前还没有针对Neo4J存储库的集成测试。 现在,我已经向这个现有的JPA web应用程序添加了一些Neo4J功能。 我现在使用Neo4J存储库和JPA存储库。我的实体和存储库的名称不同,并且位于不同的包中。 我的所有测试都扩展了以下类: 当应用程序配置没有任何配置时,测试可以正常运行 但在添加Neo4J配置时出现异常错误: