当我想用@PostConstruct调用一个方法时,该方法不会被调用。我没有从服务器得到任何错误或日志。我是否必须添加一些配置xml文件或添加其他注释才能调用该方法?
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;
}
}发布于 2017-01-13 04:49:54
我认为问题出在代码的这一部分:
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行,它应该可以工作。您不需要在会话中手动保存实例。
发布于 2017-01-13 04:51:31
大多数EJB都是延迟初始化的,因此只有在实际使用该bean的实例时才会调用@PostConstruct。
也就是说,您永远不会在存储中使用servlet中的实际sessionbean,因此不需要调用@PostConstruct
您可以从会话中覆盖它,也可以重新创建它
storage = (Storage) session.getAttribute(Storage.class.getName());
if (storage == null) {
storage = new Storage();
session.setAttribute(Storage.class.getName(), storage);
} https://stackoverflow.com/questions/41622516
复制相似问题