首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未调用EJB @PostConstruct

未调用EJB @PostConstruct
EN

Stack Overflow用户
提问于 2017-01-13 04:36:59
回答 2查看 1.8K关注 0票数 1

当我想用@PostConstruct调用一个方法时,该方法不会被调用。我没有从服务器得到任何错误或日志。我是否必须添加一些配置xml文件或添加其他注释才能调用该方法?

Serlvet:

代码语言:javascript
复制
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

代码语言:javascript
复制
@Stateless
public class PersonDAO {

    @PersistenceContext
    private EntityManager em;

    public List<Person> getAllPersons() {

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

    }

}

存储:

代码语言:javascript
复制
@Stateless
public class Storage {

    @EJB
    PersonDAO psDAO;

    private List<Entity> personList;

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

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

PersonEntityCollectionProcessor:

代码语言:javascript
复制
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;
    }

}
EN

回答 2

Stack Overflow用户

发布于 2017-01-13 04:49:54

我认为问题出在代码的这一部分:

代码语言:javascript
复制
    storage = (Storage) session.getAttribute(Storage.class.getName());
    if (storage == null) {
       storage = new Storage();
       session.setAttribute(Storage.class.getName(), storage);
    }    

这样,您就可以创建Storage的非托管实例,而不是使用注入的实例,因此不会调用@PostConstruct。如果在执行此代码时,通过@EJB注入的Storage实例为null,则注入可能存在问题。

您可以删除这5行,它应该可以工作。您不需要在会话中手动保存实例。

票数 4
EN

Stack Overflow用户

发布于 2017-01-13 04:51:31

大多数EJB都是延迟初始化的,因此只有在实际使用该bean的实例时才会调用@PostConstruct。

也就是说,您永远不会在存储中使用servlet中的实际sessionbean,因此不需要调用@PostConstruct

您可以从会话中覆盖它,也可以重新创建它

代码语言:javascript
复制
    storage = (Storage) session.getAttribute(Storage.class.getName());
    if (storage == null) {
       storage = new Storage();
       session.setAttribute(Storage.class.getName(), storage);
    }     
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41622516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档