首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@Inject - UserTransaction抛出焊接错误

@Inject - UserTransaction抛出焊接错误
EN

Stack Overflow用户
提问于 2020-02-24 20:05:14
回答 1查看 393关注 0票数 0

错误:

代码语言:javascript
复制
Exception 1 :
org.jboss.weld.exceptions.DefinitionException: WELD-001451: javax.transaction.UserTransaction cannot be injected into an enterprise bean with container-managed transactions: [BackedAnnotatedField] @Inject com.evry.integrator.snow.model.dao.impl.GenericDaoImpl.userTransaction
        at com.evry.integrator.snow.model.dao.impl.GenericDaoImpl.userTransaction(GenericDaoImpl.java:0)
  StackTrace
        at org.jboss.weld.module.ejb.WeldEjbValidator.validateInjectionPointForDefinitionErrors(WeldEjbValidator.java:40)
        at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDefinitionErrors(Validator.java:336)

代码:

代码语言:javascript
复制
public abstract class GenericDaoImpl<T, PK> implements GenericDao<T, PK> {

   private static final Logger LOG = Logger.getLogger(GenericDaoImpl.class.getName());
   @PersistenceContext(unitName = "IntegratorMasterdataDS")
   protected EntityManager em;

   @Inject
   UserTransaction userTransaction

审查类

代码语言:javascript
复制
@Stateless
public class Scrutiny {
    private static final Logger log = Logger.getLogger(Scrutiny.class.getName());

    public Scrutiny() {
        System.out.println("Scrutiny");
    }

    @Inject
    StatusDao statusDao;

    public JobStatus insertNewRecord(JobName jName)  {

    log.info("insertNewRecord:" + jName);

    try {
        statusDao.beginUserTransaction(); <--- Here i want to begin
        statusDao.create(js);
        statusDao.flush();
        statusDao.commitUserTransaction(); <--- Here i want to Commit
    } catch (Exception e) {
        log.warning("insertNewRecord:" + e);
    }

状态Dao:

代码语言:javascript
复制
public interface StatusDao extends GenericDao<JobStatus, String> {
    List<JobStatus> checkExistingRecordToday(JobName jName);
}

作业状态Dao:

代码语言:javascript
复制
@Stateless
public class JobStatusDaoImpl extends GenericDaoImpl<JobStatus, String> implements StatusDao {
private static final Logger LOG = Logger.getLogger(JobStatusDaoImpl.class.getName());

@Override
public List<JobStatus> checkExistingRecordToday(JobName jName) {

到目前为止,整个过程都是由JTA处理的,但我想立即提交检查类,这表明作业刚刚开始,最后想要更新它。

EN

回答 1

Stack Overflow用户

发布于 2020-04-02 20:35:32

您应该从DAO泛型对象中删除UserTransaction注入,并在检查bean中处理事务,并使用TransactionManagement对其进行注释。

你的bean代码应该是这样的:

代码语言:javascript
复制
@Stateless
@TransactionManagement(value=TransactionManagementType.BEAN)
public class Scrutiny {

    private static final Logger log = Logger.getLogger(Scrutiny.class.getName());

    @Inject
    private UserTransaction utx;
    public Scrutiny() {
        System.out.println("Scrutiny");
    }

    @Inject
    StatusDao statusDao;

    public JobStatus insertNewRecord(JobName jName)  {

    log.info("insertNewRecord:" + jName);

    try {
        utx.begin(); <--- Here i want to begin
        statusDao.create(js);
        utx.flush();
        utxcommit(); <--- Here i want to Commit
    } catch (Exception e) {
        log.warning("insertNewRecord:" + e);
    }
}

有了这些更改,您的DAO应该可以使用容器管理的事务继续工作,而您的特定bean可以根据需要控制事务。

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

https://stackoverflow.com/questions/60375591

复制
相关文章

相似问题

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