Problems after updating SEAM 2.0 to 2.2
Hello,
I am working on an EAR deployed on JBoss 5.1 (I tried also with 5.0)
and the jboss-seam Framework. I used previously the Version 2.0.1 of
seam and now want to update to 2.2. So I created a new Project with
some EntyBeans and Some SessionBeans available using Bijection. One of
my EntyBeans is the realisation of a User:
<<<<<<<<<<<<<<<<<< Begin: User. java >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
@Entity(name = "User")
@Name("user")
@Scope(ScopeType.SESSION)
@Table(name = "userlogin")
public class User implements java.io.Serializable {
@Id
@Column(name = "id", nullable = false, unique = true)
private Long id;
@Column(name = "username", nullable = false, unique = true)
private String name;
@Column(name = "userpassword", nullable = true)
private String password;
[+ getter, setter, hashCode, equals and toString, so all I need]
<<<<<<<<<<<<<<<<<< End: User. java >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Then I created a Session Bean to work on the Users. e.g. it can List
up all users:
<<<<<<<<<<<<<<<<<< Begin UserManager.java >>>>>>>>>>>>>>>>>>>>>>>>>>
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import de.upb.vdrive.mda.model.security.User;
@Stateless
@Name("userManager")
public class UserManagerBean implements UserManager {
@In
private EntityManager entityManager;
public List<User> getUsers() {
return entityManager.createQuery("from User u").getResultList();
}
}
<<<<<<<<<<<<<<<<<< End UserManager.java >>>>>>>>>>>>>>>>>>>>>>>>>>
At statup of my Application I have to do some initialisation work. It
is no SessionBean, but a simple POJO. I simplified it to just print a
List of all users:
<<<<<<<<<<<<<<<<<< Begin StartupManager.java
import java.util.List;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Observer;
import org.jboss.seam.log.Log;
import de.upb.vdrive.mda.model.security.User;
@Name("bootstrapper")
public class StartUpManager {
@In(create=true)
private UserManager userManager;
@Observer("org.jboss.seam.postInitialization")
public void initialisation() {
log.info("Users:");
for (User user : userManager.getUsers()) {
log.info("User #0", user.getName());
}
}
}
<<<<<<<<<<<<<<<<<< End StartupManager.java >>>>>>>>>>>>>>>>>>>>>>>>>>
This runs very good and I get a List of all users in my database at
startup. For Login I created a LoginBean, which is realized as a
stateless session bean. I set in components.xml the Login as follows:
<<<<<<<<<<<<<<< Begin: Part of components.xml >>>>>>>>>>>>>>>>>>>>>>>>
<persistence:managed-persistence-context name="entityManager" auto-
create="true"
persistence-unit-jndi-name="@puJndiName@"/>
<drools:rule-base name="securityRules">
<drools:rule-files>
<value>/security.drl</value>
</drools:rule-files>
</drools:rule-base>
<security:rule-based-permission-resolver security-rules="#
{securityRules}"/>
<security:identity authenticate-method="#{login.authenticate}"
remember-me="true"/>
<event type="org.jboss.seam.security.notLoggedIn">
<action execute="#{redirect.captureCurrentView}"/>
<action execute="#{identity.tryLogin}"/>
</event>
<event type="org.jboss.seam.security.loginSuccessful">
<action execute="#{redirect.returnToCapturedView}"/>
</event>
<<<<<<<<<<<<<<< End: Part of components.xml >>>>>>>>>>>>>>>>>>>>>>>>
My LoginBean realized as followed results in an exception:
<<<<<<<<<<<<<<< Begin: LoginBean.java >>>>>>>>>>>>>>>>>>>>>>>>>>>>>
import java.util.List;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.log.Log;
import org.jboss.seam.security.Credentials;
import org.jboss.seam.security.Identity;
import de.upb.vdrive.mda.model.security.User;
import de.upb.vdrive.mda.action.configuration.UserManager;
@Stateless
@Name("login")
// @Scope(ScopeType.SESSION)
public class LoginBean implements Login {
@Logger
private Log log;
@UserManager
private UserManager userManager;
@In
private Identity identity;
@In
private Credentials credentials;
@Out(required = false)
private User user;
@SuppressWarnings("unchecked")
public boolean authenticate() {
List<User> users = userManager.getUsers();
[....]
}
}
<<<<<<<<<<<<<<< Begin: LoginBean.java >>>>>>>>>>>>>>>>>>>>>>>>>>>>>
While in the StatupManager the usage of UserManager was all right, in
the LoginBean I get the following Exception when I reach the the first
usage of userManager:
<<<<<<<<<<<<<<<<Begin: Exception after calling userManager.getUsers in
LoginBean >>>>>>>>>>>>>>
21:26:19,286 WARN [SeamLoginModule] Error invoking login method
javax.el.ELException: javax.ejb.EJBTransactionRolledbackException:
EntityManagerFactory not found in JNDI : java:comp/env/mda2009/pu
at org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:
339)
[....]
Caused by: javax.naming.NameNotFoundException: mda2009 not bound
at org.jnp.server.NamingServer.getBinding(NamingServer.java:771)
[....]
<<<<<<<<<<<<<<<<End: Exception after calling userManager.getUsers in
LoginBean >>>>>>>>>>>>>>
I get the same if I try to access an EntityManager realized by
<code>@In private EntiyManager entityManager;</code> in LoginBean. But
I can access the Database by using <code>@PersistencyContext private
EntiyManager entityManager;</code>, e.g. the following LoginBean has
no Problems:
<<<<<<<<<<<<<<< Begin: LoginBean.java >>>>>>>>>>>>>>>>>>>>>>>>>>>>>
import java.util.List;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.log.Log;
import org.jboss.seam.security.Credentials;
import org.jboss.seam.security.Identity;
import de.upb.vdrive.mda.model.security.User;
@Stateless
@Name("login")
// @Scope(ScopeType.SESSION)
public class LoginBean implements Login {
@Logger
private Log log;
@PersistencyContext
private EntityManager entityManager;
@In
private Identity identity;
@In
private Credentials credentials;
@Out(required = false)
private User user;
@SuppressWarnings("unchecked")
public boolean authenticate() {
List<User> users = entityManager.createQuery("from User u where
name=:name").setParameter("name", credentials.getUsername
()).getResultList();
[....]
}
}
<<<<<<<<<<<<<<< Begin: LoginBean.java >>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Using this I get a running version. My Problem is, that a login there
has to happen some operations, and I need to access my other Beans
there, so this is not o.k. for me. Can anybody give me a hint, what is
going wrong there?
bests
Sascha Effert