2017-01-12 5 views
1

Wenn ich eine Methode mit @PostConstruct aufrufen möchte, wird die Methode nicht aufgerufen. Ich bekomme keine Fehler oder Logs vom Server. Muss ich einige Konfigurations-XML-Dateien hinzufügen oder zusätzliche Anmerkungen hinzufügen, um die Methode aufzurufen?EJB @PostConstruct nicht aufgerufen

Serlvet:

public class PersonServlet extends HttpServlet { 

    private static final long serialVersionUID = 1L; 
    private static final Logger LOG = LoggerFactory.getLogger(PersonServlet.class); 

    @EJB 
    Storage storage; 

    protected void service(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException { 
     try { 
     HttpSession session = req.getSession(true); 
     storage = (Storage) session.getAttribute(Storage.class.getName()); 
     if (storage == null) { 
      storage = new Storage(); 
      session.setAttribute(Storage.class.getName(), storage); 
     }  
     // create odata handler and configure it with CsdlEdmProvider and Processor 
     OData odata = OData.newInstance(); 
     ServiceMetadata edm = odata.createServiceMetadata(new PersonEdmProvider(), new ArrayList<EdmxReference>()); 
     ODataHttpHandler handler = odata.createHandler(edm); 
     handler.register(new PersonEntityCollectionProcessor(storage)); 
     handler.register(new PersonEntityProcessor(storage)); 
     handler.register(new PersonPrimitiveProcessor(storage)); 

     // let the handler do the work 
     handler.process(req, resp); 
     } catch (RuntimeException e) { 
     LOG.error("Server Error occurred in ExampleServlet", e); 
     throw new ServletException(e); 
     } 
    } 
} 

PersonDao

@Stateless 
public class PersonDAO { 

    @PersistenceContext 
    private EntityManager em; 

    public List<Person> getAllPersons() { 

     return 
      em.createQuery("SELECT p FROM T_Person p", Person.class).getResultList(); 

    } 

} 

Lagerung:

@Stateless 
public class Storage { 

    @EJB 
    PersonDAO psDAO; 

    private List<Entity> personList; 

    public Storage() { 
     personList = new ArrayList<Entity>(); 
    } 

    @PostConstruct 
    private void initSampleData(){ 
     psDAO.getAllPersons(); 
    } 
} 

PersonEntityCollectionProcessor:

public class PersonEntityCollectionProcessor implements EntityCollectionProcessor { 

    private OData odata; 
    private ServiceMetadata serviceMetadata; 
    private Storage storage; 

    public PersonEntityCollectionProcessor(Storage storage) { 
     this.storage = storage; 
    } 

    public void init(OData odata, ServiceMetadata serviceMetadata) { 
     this.odata = odata; 
     this.serviceMetadata = serviceMetadata; 
    } 

} 
+0

neu Hat einer der Antworten Ihr Problem beheben? – AceFunk

Antwort

4

Ich denke, das Problem dieser Teil des Codes ist:

storage = (Storage) session.getAttribute(Storage.class.getName()); 
    if (storage == null) { 
     storage = new Storage(); 
     session.setAttribute(Storage.class.getName(), storage); 
    }  

Damit Sie eine nicht verwaltete Instanz der Storage erstellen, anstatt die injizierte Instanz verwendet und damit die @PostConstruct wird nicht aufgerufen. Wenn die Instanz Storage, die über @EJB eingegeben wird, null ist, wenn dieser Code ausgeführt wird, liegt möglicherweise ein Problem mit der Injektion vor.

Sie können diese 5 Zeilen entfernen und es sollte funktionieren. Sie müssen die Instanz in der Sitzung nicht manuell speichern.

3

Die meisten EJBs werden langsam initialisiert, daher wird @PostConstruct nur dann aufgerufen, wenn Sie tatsächlich eine Instanz dieser Bean verwenden.

Das sagte; Sie niemals die tatsächliche SessionBean in Speicher aus dem Servlet verwenden, so dass keine Notwendigkeit, immer rufen @PostConstruct

Sie es aus der Sitzung zu überschreiben, oder es

storage = (Storage) session.getAttribute(Storage.class.getName()); 
    if (storage == null) { 
     storage = new Storage(); 
     session.setAttribute(Storage.class.getName(), storage); 
    }  
+0

Danke für Ihre Antworten! Das war das Problem. – manban

+0

Es macht auch keinen Sinn, eine '@ Stateless'-Bean in der Sitzung zu speichern, da sie keinen Zustand speichern sollte. Stateless Beans sollten wie Klassen mit statischen Methoden behandelt werden - sie können jederzeit neu erstellt werden und Sie sollten sich nicht auf Instanzdaten zwischen Methodenaufrufen verlassen. Wahrscheinlich möchten Sie stattdessen '@ Stateful' verwenden. – OndrejM

Verwandte Themen