@Unwrap onto SFSB
tom_goring Mar 29, 2007 11:47 AMHi All,
I have 2 'manager component' style beans. One called the 'Accountant' and the other 'User'. The idea is that in the session I store the id of these things and in my managers I get the real objects. Both are ScopeType.CONVERSATION. Both also use SLSB's to make the call to get the data.
The idea is that I want it to be transparent to the application code that these objects are infact reread if they have not been cached in any current conversation.
The User manager is itself a SFSB while the Accountant is a POJO (I'm trying to see the results of both methods).
Now in another SFSB (my action handler) I get some odd results using the above...
My first question is:
1) If I Inject @In(value="User", required=true) I works first time the page is displayed, but second time get get a transaction not open exception. If I change this to @In(value="User", create=true) it works ?
2) If I Inject @In(value='Accountant', create=true) I get a
6:23:48,343 WARN [Contexts] Could not destroy component: accountantCRUDBean javax.ejb.EJBNoSuchObjectException: Could not find Stateful bean: 5c4o05-8pkcob-ezvcgh2q-1-ezvcx10a-2tbut apart from that it works ?
Here is my code:
@Stateful
@Name(UserComponentNames.User)
@Scope(ScopeType.CONVERSATION)
public class UserComponentManagerBean implements UserComponentManager {
@In(value=UserComponentNames.UserId,required=false)
private Long userId = null;
@EJB
private UserManagerLocal userManager;
@Logger private Log log;
private User cachedUser=null;
@Create
public void create() {
log.info("create");
}
@Unwrap
public User getUserComponent() {
if ( cachedUser!=null ) {
return cachedUser;
}
if ( userId!=null ) {
cachedUser = userManager.getUser(userId);
return cachedUser;
}
return null;
}
@Destroy @Remove
public void destroy() {
log.info("destroy");
}
}
@Name(AccountantComponentNames.Accountant)
@Scope(ScopeType.CONVERSATION)
public class AccountantComponentManager {
@In(value=AccountantComponentNames.AccountantId,required=false)
private Long accountantId = null;
@In(create=true)
private CompanyManagerLocal companyManagerLocal;
private Accountant cachedAccountant=null;
@Unwrap
public Accountant getAccountantComponent() {
if ( cachedAccountant!=null ) {
return cachedAccountant;
}
if ( accountantId!=null ) {
cachedAccountant = companyManagerLocal.getAccountant(accountantId);
return cachedAccountant;
}
return null;
}
}
@Stateful
@Scope(ScopeType.CONVERSATION)
@Name("accountantCRUDBean")
public class AccountantCRUDBean extends StandardCRUDBean<Accountant> implements AccountantCRUD, Serializable {
private static final long serialVersionUID = 1L;
@In(value=AccountantComponentNames.Accountant, create=true)
private Accountant userLinkedAccountant=null;
@In(value=UserComponentNames.User, create=true)
private User user;
@EJB
private CompanyManagerLocal companyManager=null;