Erro jboss seam (entity manager null)

5 respostas
J

galera

eu to fazendo uma aplicação usando jboss seam, e to começando a estudar ele agora.

Dai eu to fazendo um login, e na hora de chamar o entity manager....ta vindo nulo. Segue o erro dado:
23:32:37,453 INFO  [org.jboss.bootstrap.impl.base.server.AbstractServer] JBossAS [6.0.0.Final "Neo"] Started in 43s:959ms
23:33:09,064 WARN  [org.jboss.seam.security.jaas.SeamLoginModule] Error invoking login method: javax.el.ELException: org.jboss.seam.RequiredException: @In attribute requires non-null value: authenticator.em
	at org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:339) [:1.0_02.CR5]
	at org.jboss.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:348) [:1.0_02.CR5]
	at org.jboss.el.parser.AstPropertySuffix.invoke(AstPropertySuffix.java:58) [:1.0_02.CR5]
	at org.jboss.el.parser.AstValue.invoke(AstValue.java:96) [:1.0_02.CR5]
	at org.jboss.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276) [:1.0_02.CR5]
	at org.jboss.seam.core.Expressions$2.invoke(Expressions.java:175) [:2.2.1.Final]
	at org.jboss.seam.security.jaas.SeamLoginModule.login(SeamLoginModule.java:109) [:2.2.1.Final]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_22]
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) [:1.6.0_22]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) [:1.6.0_22]
	at java.lang.reflect.Method.invoke(Unknown Source) [:1.6.0_22]
	at javax.security.auth.login.LoginContext.invoke(Unknown Source) [:1.6.0_22]
	at javax.security.auth.login.LoginContext.access$000(Unknown Source) [:1.6.0_22]
	at javax.security.auth.login.LoginContext$5.run(Unknown Source) [:1.6.0_22]
	at java.security.AccessController.doPrivileged(Native Method) [:1.6.0_22]
Caused by: org.jboss.seam.RequiredException: @In attribute requires non-null value: authenticator.em
	at org.jboss.seam.Component.getValueToInject(Component.java:2361) [:2.2.1.Final]
	at org.jboss.seam.Component.injectAttributes(Component.java:1739) [:2.2.1.Final]
	at org.jboss.seam.Component.inject(Component.java:1557) [:2.2.1.Final]
	at org.jboss.seam.core.BijectionInterceptor.aroundInvoke(BijectionInterceptor.java:61) [:2.2.1.Final]
	at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) [:2.2.1.Final]
	at org.jboss.seam.core.MethodContextInterceptor.aroundInvoke(MethodContextInterceptor.java:44) [:2.2.1.Final]
meu components.xml
<?xml version="1.0" encoding="UTF-8"?>
<components xmlns="http://jboss.com/products/seam/components"
            xmlns:core="http://jboss.com/products/seam/core"
            xmlns:persistence="http://jboss.com/products/seam/persistence"
            xmlns:drools="http://jboss.com/products/seam/drools"
            xmlns:bpm="http://jboss.com/products/seam/bpm"
            xmlns:security="http://jboss.com/products/seam/security"
            xmlns:mail="http://jboss.com/products/seam/mail"
            xmlns:web="http://jboss.com/products/seam/web"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation=
                "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.2.xsd
                 http://jboss.com/products/seam/persistence http://jboss.com/products/seam/persistence-2.2.xsd
                 http://jboss.com/products/seam/drools http://jboss.com/products/seam/drools-2.2.xsd
                 http://jboss.com/products/seam/bpm http://jboss.com/products/seam/bpm-2.2.xsd
                 http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.2.xsd
                 http://jboss.com/products/seam/mail http://jboss.com/products/seam/mail-2.2.xsd
                 http://jboss.com/products/seam/web http://jboss.com/products/seam/web-2.2.xsd
                 http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.2.xsd">

   <core:init debug="true" jndi-pattern="@jndiPattern@"/>

   <core:manager concurrent-request-timeout="500"
                 conversation-timeout="120000"
                 conversation-id-parameter="cid"
                 parent-conversation-id-parameter="pid"/>

   <!-- Make sure this URL pattern is the same as that used by the Faces Servlet -->
   <web:hot-deploy-filter url-pattern="*.seam"/>

   <persistence:managed-persistence-context name="entityManager" auto-create="true"
                      persistence-unit-jndi-name="java:/CondominioEntityManagerFactory"/>

   <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="#{authenticator.authenticate}" remember-me="true"/>

   <event type="org.jboss.seam.security.notLoggedIn">
      <action execute="#{redirect.captureCurrentView}"/>
   </event>
   <event type="org.jboss.seam.security.loginSuccessful">
      <action execute="#{redirect.returnToCapturedView}"/>
   </event>

   <mail:mail-session host="localhost" port="25"/>

   <!-- For use with jBPM pageflow or process management -->
   <!--
   <bpm:jbpm>
      <bpm:process-definitions></bpm:process-definitions>
      <bpm:pageflow-definitions></bpm:pageflow-definitions>
   </bpm:jbpm>
   -->

</components>
meu persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- Persistence deployment descriptor for dev profile -->
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
             version="1.0">
             
   <persistence-unit name="Condominio">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <jta-data-source>java:/CondominioDatasource</jta-data-source>
       <class>br.com.cond.entidade.Usuario</class>
      <!-- The <jar-file> element is necessary if you put the persistence.xml in the WAR and the classes in the JAR -->
      <!--
      <jar-file>../../vehicles.jar</jar-file>
      -->
      <properties>
         <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
         <property name="hibernate.hbm2ddl.auto" value="update"/>
         <property name="hibernate.show_sql" value="true"/>
         <property name="hibernate.format_sql" value="true"/>
         <property name="jboss.entity.manager.factory.jndi.name" value="java:/CondominioEntityManagerFactory"/>
      </properties>
   </persistence-unit>
    
</persistence>
minha entidade:
package br.com.cond.entidade;

@Entity
@Name("usuario")
@Scope(ScopeType.SESSION)
@Table(name="usuario")
@SequenceGenerator(name="usuario_seqc", sequenceName="usuario_codigo_seq")
public class Usuario implements Serializable 
{

	private static final long serialVersionUID = 1L;
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO, generator="usuario_seqc")
	private long codigo;
	private String login;
	private String password;
	private String nome;
	private String email;
	
	public long getCodigo() {
		return codigo;
	}
	public void setCodigo(long codigo) {
		this.codigo = codigo;
	}
	public String getLogin() {
		return login;
	}
	public void setLogin(String login) {
		this.login = login;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
}
Meu autenticator:
@Name("authenticator")
public class Authenticator
{
    @Logger private Log log;

    @In Identity identity;
    @In Credentials credentials;
    @In (required=false )private Usuario usuario;

    @In(create=true, required=true)
    @Out(required=true)
    private EntityManager em;
    
    public boolean authenticate()
    {
        log.info("authenticating {0}", credentials.getUsername());
        boolean result = false;
        if(getUsuario() == null)
        {
        	try
        	{
        		Identity identity = Identity.instance();
                
                Query q = em.createQuery(" from usuario where login = :userName and password= :password")
                	.setParameter("username", identity.getUsername())
                	.setParameter("password", identity.getPassword());
                setUsuario((Usuario)q.getSingleResult());
        	}
        	catch(NoResultException nre)
        	{
        		FacesMessages.instance().add("Usuario/senha não localizado");
        	}
        }
        result = (getUsuario() == null)?false:true;
        return result;
    }
    
    @Destroy @Remove
    public void destroy()
    {
    	
    }

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

alguem tem ideia do que pode ser o erro? :?

5 Respostas

A

[b]Já passei por esse problema e ainda não consegui resolver.

Utiliso o Session do hibernate para fazer a consulta na autenticação.

Se conseguir resolver, posta ai.

Abraço.[/b]

J

poutz, vc ta brincando que só assim é possivel fazer isso?

pior que ja tentei de varias formas, e sempre vem null esse entity manager

J

alberthy

vc pode postar seu components.xml pra eu ver como ficou…vou apelar pro session do hibernate mesmo rs

J

caraaaa, resolvi usando hibernate. Segue abaixo a solução:

<persistence:hibernate-session-factory name="hibernateSessionFactory"/>

	<persistence:managed-hibernate-session name="emDataBase" auto-create="true" session-factory-jndi-name="java:/EmSessionFactory"/>
<session-factory name="java:/EmSessionFactory">
  <property name="transaction.flush_before_completion">true</property>
    <property name="connection.release_mode">after_statement</property>
    <property name="transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</property>
    <property name="transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>
    <property name="connection.datasource">java:/SeuDatasource</property>
    
  <property name="hibernate.connection.driver_class">org.hibernate.dialect.PostgreSQLDialect</property>
  <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/postgres</property>
  <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
  <property name="hibernate.connection.username">postgres</property>
  <property name="hibernate.connection.password">admin</property>
  <property name="hibernate.show_sql">false</property>
  <property name="hibernate.hbm2ddl.auto">update</property>
  <property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
 </session-factory>

e nas suas classes, vc pode chamar:

@In Session emDataBase;

prontinho, agora não vem mais nulo. :D

falow

J

Dá uma olhada também nos exemplos que vem junto com o Seam… Eles ajudam bastante para se aprender como faz, e ainda tem algumas explicações sobre alguns exemplos na documentação oficial.

Abraços.

EDIT: coloca [RESOLVIDO] no tópico pra ajudar quem procura! :smiley:

Criado 9 de abril de 2011
Ultima resposta 11 de abr. de 2011
Respostas 5
Participantes 3