2017-01-12 9 views
1

Когда я хочу вызывать метод с @PostConstruct, метод не вызывается. У меня нет ошибок или журналов с сервера. Нужно ли добавлять некоторые файлы конфигурации xml или добавлять дополнительные аннотации для вызова метода?EJB @PostConstruct not called

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(); 

    } 

} 

Хранение:

@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

ли какой-либо из ответов, представленных устранить проблему? – AceFunk

ответ

4

Я думаю, что проблема эта часть коды:

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

С этим вы создаете неуправляемый экземпляр Storage вместо использования впрыскиваемого экземпляра и поэтому @PostConstruct не называются. Если экземпляр Storage, введенный через @EJB, является null, когда этот код выполнен, может возникнуть проблема с инъекцией.

Вы можете удалить эти 5 строк, и он должен работать. Вам не нужно сохранять экземпляр вручную в сеансе.

3

Большинство EJB инициализируются лениво, поэтому @PostConstruct вызывается только при первом использовании экземпляра этого компонента.

Это сказано; вы никогда не использовать фактические SessionBean в хранилище из сервлета, поэтому нет необходимости, чтобы когда-нибудь позвонить @PostConstruct

Вы перезаписать его с сессии, или воссоздать его

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

Спасибо за ваши ответы! Это была проблема. – manban

+0

Также не имеет смысла хранить бит '@ Stateless' в сеансе, так как он не должен сохранять какое-либо состояние. Бланки без состояния должны рассматриваться как классы со статическими методами - их можно воссоздать в любое время, и вы не должны полагаться на данные экземпляра между вызовами метода. Вероятно, вы захотите использовать '@ Stateful'. – OndrejM