inject stateless bean into a singleton bean

2.2k views Asked by At

I have this requirement: I have a singleton bean and I have a method annotated with @PostConstruct where I perform some initialization. One of the initialization is to read some values from a DB, so I want to inject in this method a Stateless bean which is a service bean that access the DB. I don't want to inject the stateless bean as a field in the singleton bean because it is needed only in this method (nowhere else in the singleton bean). To do so I did wrote this in singleton bean:

@Singleton
public class MySingletonBean {

    @PostConstruct
    @EJB
    public void init(SLSBService service) { /* use service to read from DB */ };
    ...
}

The problem is that the Singleton bean can not be instantiated. Any idea? Thank you in advance.

1

There are 1 answers

0
Roland Tiefenbrunner On BEST ANSWER

As the @PostConstruct annotated (callback) method is actually called after all references are resolved (all beans injected) I do not think this construct works.

What you could do or try out is to remove the @PostConstruct and using normal setter injection. However, be aware that other injected resources have not necessarily been resolved at this time.

@EJB
public void setService(SLSBService service){
     service.doSmg();
}

@Stateless    
public class SLSBService{
    @PersistenceContext
    private EntityManager em;

    @TransactionAttribute(TransactionAttributeType.MANDATORY)
    public void doSmg() {
        Member member = new Member();
        member.setEmail("[email protected]");
        member.setName("fubu");
        member.setPhoneNumber("453454534535");
        em.persist(member);
    }
}

/* edit */

Just had some time for trying it out. The construct should be usable for DAOs, as the method is executed within a transaction and also the EntityManager (within the SLBService) is injected properly. And as expected references to other EJBs have not be resolved yet, so be aware of that.