2017-01-12 28 views
1

@PostConstructでメソッドを呼び出す場合、メソッドは呼び出されません。私はサーバーからエラーやログを取得しません。いくつかの構成XMLファイルを追加するか、メソッドを呼び出すために注釈を追加する必要がありますか?EJB @PostConstructが呼び出されていない

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

が提供する回答のいずれかがあなたの問題を解決しました、それを再作成、サーブレットからストレージの実際のSessionBeanのを使用することはありませんか? – AceFunk

答えて

4

私はこの問題は、コードのこの部分だと思う。これにより

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行を削除できます。セッションでインスタンスを手動で保存する必要はありません。

3

ほとんどのEJBは遅延的に初期化されるため、@PostConstructは、そのBeanのインスタンスを実際に使用するときに初めて呼び出されます。

それは言った。そう、これまで@PostConstruct

を呼び出す必要あなたはセッションからそれを上書きしていない、または

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

あなたの答えをありがとう!それが問題でした。 – manban

+0

また、 '@ Stateless'ビーンをセッションに格納するのは意味がありません。なぜなら、それは何の状態も格納してはいけないからです。ステートレスBeanは、静的メソッドを持つクラスのように扱う必要があります。いつでも再作成することができ、メソッド呼び出し間のインスタンスデータに頼るべきではありません。おそらく '@ Stateful'を代わりに使いたいでしょう。 – OndrejM

関連する問題