2016-12-20 5 views
1

Ich versuche zu verstehen, wie @EJB (BeanName = "etc") funktioniert. Ich habe versucht, es zu verwenden, und wenn es aufgerufen wird, bleibt null. Ich habe in anderen Threads gelesen, dass ich ein "new ClassNameEJB()" nicht verwenden sollte, um es zu initialisieren. Ich habe den Eindruck, dass die Verwendung der @ EJB Annotation die Initialisierung für das lokale private Feld bereitstellt. Hier sind meine Ausführungen:@EJB Annotation Null

Bean Klasse:

@Stateless(name = "AsynchronousErrorLog") 
@TransactionManagement(TransactionManagementType.BEAN) 
public class AsynchronousErrorLogEJB { 

@PersistenceContext(unitName = "errorLog") 
EntityManager entityManager; 
@Resource 
private EJBContext context; 
private static final Logger LOG = Logger.getLogger(AsynchronousErrorLogEJB.class); 


/** 
* logError: method to store error within the database 
* @param errorLog: log to be persisted to the database 
*/ 
@Asynchronous 
public void logError(final ErrorLog errorLog) { 
    try { 
     LOG.debug("Entering logError"); 
     context.getUserTransaction().begin(); 
     entityManager.persist(errorLog); 
     context.getUserTransaction().commit(); 
    } catch (final Exception e) { 
     LOG.secureError("Exception while logging error during transaction", e); 
     try { 
      context.getUserTransaction().rollback(); 
     } catch (final Exception e1) { 
      LOG.secureError("Could not rollback transaction", e1); 
     } 
    } 
    LOG.debug("error logging complete."); 
} 

} 

ich in einer Klasse haben ein privates @EJB Feld als solche geschrieben:

@EJB(beanName="AsynchronousErrorLogEJB") 
private AsynchronousErrorLogEJB errorLogLocal; 

, die die EJB als solche verwendet:

try { 
     ErrorLog eLog = new ErrorLog(e, ServerName.getServerName()); 
     errorLogLocal.logError(eLog); 
    } catch (GeneralException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

Ich habe die Tabellenstruktur für diese EJB als solche:

@Entity(name="ERROR_LOG") 
public class ErrorLog { 

    @Id 
    @Column(name="ERROR_LOG_ID") 
    private String errorLogId; 
    @Column(name="ERROR_MESSAGE") 
    private String errorMessage; 
    @Column(name="TIMESTAMP") 
    private Date timeStamp; 
    @Column(name="SERVER_NAME") 
    private String serverName; 
    @Column(name="STACK_TRACE") 
    private String stackTrace; 

Wenn es zu errorLogLocal.logError kommt, wird es direkt darüber übergeben. Beim Debuggen in JBoss 9 ist der Wert für errorLogLocal null. Gibt es einen Schritt, den ich irgendwo vermisse? Muss ich eine zugrunde liegende Struktur in eine XML-Datei in den Container einbeziehen? Muss ich in einigen Fällen INitialContext.lookup verwenden oder kann ich die @ EJB-Notation ohne Nachschlagen verwenden?

EDIT: Ich habe die erforderlichen Elemente meiner persistence.xml (unter META-INF) -Datei für den PersistenceContext hinzugefügt. Ich bin mir nicht sicher, ob seine ordnungsgemäß umgesetzt, aber ich folgte zusammen mit einer früheren Umsetzung:

<persistence-unit name="errorLog"> 
     <non-jta-data-source>java:/jdbc/STOMP</non-jta-data-source> 
     <class>com.ens.stomp.message.log.ErrorLog</class> 
     <properties> 
      <property name="hibernate.archive.autodetection" value="false" /> 
     </properties> 
    </persistence-unit> 

</persistence> 
+1

Verwenden Sie @EJB (beanName = "AsynchronousErrorLogEJB") von einem anderen ejb? Ich meine, Sie können @EJB nicht aus einer Klasse verwenden, die kein EJB ist. Wie Sie sagen, können Sie eine Kontextsuche durchführen, wenn das der Fall ist. – mendieta

+0

@mendieta, das muss dann der Grund sein. Also kann die EJB-Annotation nur innerhalb eines anderen EJB verwendet werden? – Joshhw

+0

Ja, das ist richtig .. Es gibt eine andere Möglichkeit .. Sie können versuchen, ein EJB zu einem pojo mit CDI und Inject Annotation, aber das ist eine andere Geschichte;) – mendieta

Antwort

0

Stellen Sie sicher, @EJB aus einem EJB, Servlets oder JSF Managed Bean .. kann man auch nichts Verwendung @EJB verwenden von einem Pojo