Java EJB Injection funktioniert in einem Bean im anderen nicht.

Fonce

Captain
Registriert
Feb. 2006
Beiträge
3.436
Hi,
ich habe da ein kleines Problem mit der EJB Injection (@EJB Annotation).
Ich habe ein EJB (FileSystemBean ) welches zur Verwaltung mehrer Instanzen dient zum Zugriff auf mein MongoDB Backend. Nun sollen mehrere ManagedBeans auf dieses Bean zugreifen können um sich die entsprechende Instanz von FileSystem zu holen.
Mit meinem ersten Bean (siehe FolderBean) welches ich zum testen angelegt hatte funktioniert das auch wunderbar.
Beim meinem zweiten Bean (siehe FolderTreeBean) funktioniert es aber nicht. Dort bekomme ich einfach nicht das FileSystemBean mittels EJB Injection.
Hat jemand eine Idee warum das nicht funktioniert?


Code:
package org.rehborn.mydms.webapp;

import com.mongodb.MongoClient;
import java.net.UnknownHostException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import org.rehborn.mydms.FileSystem;

/**
 *
 * @author Julian
 */
@Startup
@Singleton
public class FileSystemBean {

    private ConcurrentMap<String, FileSystem> backends;
    private MongoClient mongoClient;

    @PostConstruct
    public void initDMSBackend() {
        try {
            mongoClient = new MongoClient();
            backends = new ConcurrentHashMap<>();
            for (String database : mongoClient.getDatabaseNames()) {
                backends.putIfAbsent(database, new FileSystem(database));
            }
        } catch (UnknownHostException ex) {
            Logger.getLogger(FileSystemBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public FileSystem getDMSBackend(String database) {
        return backends.get(database);
    }

    public FileSystemBean() {

    }
}

Code:
package org.rehborn.mydms.webapp;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import org.rehborn.mydms.FileSystem;
import org.rehborn.mydms.Folder;

/**
 *
 * @author Julian
 */
@ManagedBean
@RequestScoped
public class FolderBean {
    
    @EJB
    private FileSystemBean dms;

    private String folderName;

    public String getFolderName() {
        return folderName;
    }

    public void setFolderName(String folderName) {
        this.folderName = folderName;
    }

    public void createFolder() {
        FileSystem fileSystem = dms.getDMSBackend("MYDMSTESTDOMAIN");
        Folder newFolder = new Folder(folderName, fileSystem.getRootFolder());
        fileSystem.createFolder(newFolder);
    }
}

Code:
package org.rehborn.mydms.webapp;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
import org.rehborn.mydms.FileSystem;
import org.rehborn.mydms.Folder;

/**
 *
 * @author Julian
 */
@ManagedBean
@RequestScoped
public class FolderTreeBean {

    private TreeNode root;

    @EJB
    private FileSystemBean dms;
    /**
     * Creates a new instance of FolderTreeBean
     */
    public FolderTreeBean() {
        root = new DefaultTreeNode("Root", null);
        FileSystem fileSystem = dms.getDMSBackend("MYDMSTESTDOMAIN");
        Folder rootFolder = fileSystem.getRootFolder();
//        root = new DefaultTreeNode(rootFolder.getName(), null);
        TreeNode node0 = new DefaultTreeNode("Node 0", root);
        TreeNode node1 = new DefaultTreeNode("Node 1", root);
        TreeNode node2 = new DefaultTreeNode("Node 2", root);

        TreeNode node00 = new DefaultTreeNode("Node 0.0", node0);
        TreeNode node01 = new DefaultTreeNode("Node 0.1", node0);

        TreeNode node10 = new DefaultTreeNode("Node 1.0", node1);
        TreeNode node11 = new DefaultTreeNode("Node 1.1", node1);

        TreeNode node000 = new DefaultTreeNode("Node 0.0.0", node00);
        TreeNode node001 = new DefaultTreeNode("Node 0.0.1", node00);
        TreeNode node010 = new DefaultTreeNode("Node 0.1.0", node01);

        TreeNode node100 = new DefaultTreeNode("Node 1.0.0", node10);
    }

    public TreeNode getRoot() {
        return root;
    }

}
 
Du kannst höchstwahrscheinlich nicht die injizierte Ejb im Konstruktor benutzen, da diese in dem Moment noch gar nicht injiziert ist.

Packe es in eine Methode und benutze unter Umständen die Annotation @PostConstruct an der Methode. (wenn FolderTreeBean so initialisiert werden muss)

Viel Glück!
 
Ahh...danke, genau das war das Problem ;)
 
Zurück
Oben