У меня проблема с отловом исключений гибернации внутри EJB с помощью транзакции, управляемой контейнером.

package com.somepackage;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
@TransactionAttribute(TransactionAttributeType.NEVER)
public class MyBusiness {
   @EJB
   Archiver archiver;

   public void doSomething(Request request) {
       try {
             Response response = new Response();
             archiver.archive(request, response);
       } catch (Exception e) {
             e.printStackTrace();
       }
   }
}

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public class Archiver {
    @EJB
    private RequestManager requestManager;
    @EJB
    private ResponseManager responseManager;

    public void archive(Request request, Response response) {
        try {
            requestManager.create(request);
            responseManager.create(response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class ResponseManager {
    @PersistenceContext(unitName = "datasource")
    private EntityManager entityManager;

    public void create(Response response) {
        try {
            entityManager.persist(response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class RequestManager {
    @PersistenceContext(unitName = "datasource")
    private EntityManager entityManager;

    public void create(Request request) {
        try {
            entityManager.persist(request);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Дело в том, что я не могу поймать исключения, такие как ConstraintViolationException и т. д., хотя я могу видеть журналы ошибок в консоли Weblogic, мой улов сообщает только об откате транзакции и ничего более.

// консольный журнал

13 мая 2019 г., 10:58:09 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions ПРЕДУПРЕЖДЕНИЕ: ошибка SQL: 1400, SQLState: 23000 13 мая 2019 г. 10:58:09 org.hibernate.engine.jdbc. spi.SqlExceptionHelper logExceptions ОШИБКА: ORA-01400: невозможно вставить NULL в («СХЕМА». «ЗАПРОС». «REF_EXCEPTION_ID»)

//// журнал заканчивается здесь

Любая помощь будет оценена.

0
Hadi Moloodi 13 Май 2019 в 09:42

2 ответа

Лучший ответ

Я нашел решение здесь

Мне просто нужно установить это в моем Weblogic Env.

set JAVA_OPTIONS=%JAVA_OPTIONS% -Dweblogic.transaction.allowOverrideSetRollbackReason=true
0
Hadi Moloodi 13 Май 2019 в 11:42

Вы должны перехватить ConstraintViolationException следующим образом:

try {
    // your logic...
} catch (EJBTransactionRolledbackException e) {
    Throwable t = e.getCause();
    while ((t != null) && !(t instanceof ConstraintViolationException)) {
        t = t.getCause();
    }
    if (t instanceof ConstraintViolationException) {
        // Handle ConstraintViolationException...
    }
}
0
stakahop 13 Май 2019 в 08:18