@Inject - UserTransaction выдает ошибку сварки - PullRequest
0 голосов
/ 24 февраля 2020

Ошибка:

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)

Код:

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

Класс проверки

@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);
    }

Статус Дао:

public interface StatusDao extends GenericDao<JobStatus, String> {
    List<JobStatus> checkExistingRecordToday(JobName jName);
}

Статус работы Dao:

@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 обрабатывает весь процесс, но я хочу мгновенно зафиксировать класс Scrutiny, который предполагает, что задание только что началось, и в конце хочу обновить его.

1 Ответ

0 голосов
/ 02 апреля 2020

Вы должны удалить инъекцию UserTransaction из вашего объекта DAO generi c и обработать транзакцию внутри компонента Scrutiny, аннотируя его с помощью TransactionManagement.

Ваш код компонента должен стать следующим:

@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 должен продолжать работать с использованием транзакций, управляемых контейнером, в то время как ваш указанный компонент c может управлять транзакцией по желанию.

...