Spring Security 3 - NullPointerException

Java

13/11/2012

Boa tarde, galera

Estou tentando implementar Spring Security 3 na minha aplicação, com JTA.
estou usando:

Servidor: Glassfish 3.1
Spring Security: 3.0.5
Hibernate: 4.1
JSF: 2.1.x

Erro do log ao tentar logar no sistema:

Advertência: #{loginBean.login}: java.lang.NullPointerException
javax.faces.FacesException: #{loginBean.login}: java.lang.NullPointerException
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
	at javax.faces.component.UICommand.broadcast(UICommand.java:315)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)

Caused by: javax.faces.el.EvaluationException: java.lang.NullPointerException
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	... 60 more
Caused by: java.lang.NullPointerException
	at br.com.testspring.bean.LoginBean.login(LoginBean.java:22)



persistence.xml :

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
   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_2_0.xsd">

	<persistence-unit name="primary" transaction-type="JTA">
	 <provider>org.hibernate.ejb.HibernatePersistence</provider> 
      <jta-data-source>jdbc/segDS</jta-data-source> 
		<properties>
		    <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="hibernate.show_sql" value="true" />
		</properties>
	</persistence-unit>

</persistence>


[b]Separei a configuração do spring em 2 duas partes [/b]

db.xml

<context:annotation-config/>
  <!--  <context:component-scan base-package="org.springframework"/>-->
  <context:component-scan base-package="br.com.testSpring"/>
   
  <bean id="ss" class="org.springframework.jndi.JndiObjectFactoryBean">
	  <property name="jndiName">
	  <value>jdbc/segDS</value>
	  </property>
  </bean>
  
  <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">  
     <property name="persistenceUnitName" value="primary"/>  
     <property name="dataSource" ref="ss" />  
  </bean>
  
  <!-- Configurando Transaction JPA --> 
  <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
  </bean>

  <tx:annotation-driven transaction-manager="transactionManager"/>
  <tx:jta-transaction-manager />
  <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
</beans>


applicationContext-security.xml

 <global-method-security secured-annotations="enabled" jsr250-annotations="enabled" />

    <http use-expressions="true" auto-config="true" > 
    
        <intercept-url pattern="/pages/**" access="isAuthenticated()" />
        <intercept-url pattern="/**" access="permitAll" />
        
        <form-login login-page="/login.xhtml" authentication-failure-url="/login.xhtml" />
        
        <access-denied-handler error-page="/semPermissao.xhtml" />

    </http>
    <beans:bean id="userDetailsService" class="br.com.testspring.service.UserDetailsServiceImpl" />
    <authentication-manager alias="authenticationManager">
       <authentication-provider user-service-ref="userDetailsService" />
     </authentication-manager>

</beans:beans>


LoginBean

@ManagedBean
@RequestScoped
public class LoginBean {

  @ManagedProperty(value = "#")
  private AuthenticationService authenticationService;

  private String userName;
  private String password;

  public String login() {
  [b]  boolean success = authenticationService.login(userName, password);[/b] // o problema parece estar aqui pelo log

    if (!success) {
      FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "Login ou senha inv�lidos");
      FacesContext.getCurrentInstance().addMessage(null, facesMessage);
      return "falhaLogin";
    }

    return "sucessoLogin";
  }


Classe AuthenticationService

@Component
public class AuthenticationService {

  @Autowired
  @Qualifier("authenticationManager")
  private AuthenticationManager authenticationManager;

  public boolean login(String username, String password) {
    try {
      UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);
      Authentication authenticate = authenticationManager.authenticate(token);
      if (authenticate.isAuthenticated()) {
        SecurityContextHolder.getContext().setAuthentication(authenticate);
        return true;
      }
    }
    catch (AuthenticationException e) {}
    return false;
  }


Alguém me ajuda?

Thiago Volpato

Thiago Volpato

Curtidas 0

Respostas

Thiago Volpato

Thiago Volpato

13/11/2012

Alguém??
GOSTEI 0
Davi Costa

Davi Costa

13/11/2012

A linha que vc destacou é a 22 do seu bean?
Parece que esse cara está nulo: authenticationService
não foi injetado corretamente.
vai ter que quebrar a cabeça para ver suas configurações

att Davi
GOSTEI 0
Thiago Volpato

Thiago Volpato

13/11/2012

Era isso msm
e mais algumas conf. que ocorreu depois

vlw

[Resolvido]
GOSTEI 0
Thiago Volpato

Thiago Volpato

13/11/2012

Davi, você sabe me dizer se é possível

injetar um @EJB na classe UserDetailsServiceImpl?

Porque na minha aplicação estou usando Spring Security 3 apenas na parte de segurança,
estou desenvolvendo orientado a interface e estou usando EJB.
Jeito que está não é o correto injetar o persistence injetado na classe UserDetailsService

ex:

por exemplo

@Service(value="userDetailsServiceImpl")
public class UserDetailsServiceImpl implements UserDetailsService {

@PersistenceContext
private EntityManager entityManager;

@Override
@Transactional(readOnly=true)
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return findByUsername(username);
}

private Users findByUsername(String username) {
try{
return entityManager.createNamedQuery("Users.findByUsername", Users.class)
.setParameter("username", username)
.getSingleResult();


poderia me dar uma ideia de como posso tratar isso

Obrigado

GOSTEI 0
Davi Costa

Davi Costa

13/11/2012

Se esse @Service for uma anotação ejb ou da plataforma jee acho que não tem problema.
Senão for, desconheço como fazer isso, teria que dar uma pesquisada

att Davi
GOSTEI 0
Thiago Volpato

Thiago Volpato

13/11/2012

Se esse @Service for uma anotação ejb ou da plataforma jee acho que não tem problema.
Senão for, desconheço como fazer isso, teria que dar uma pesquisada

att Davi


esse @service é do spring
estou achando que dessa maneira não é possivel, procure na internet e nada
vou tentar implementar de outro jeito

Obrigado

caso alguém saiba por favor comente


Att
GOSTEI 0
Jether Nascimento

Jether Nascimento

13/11/2012

Olá Thiago estou com o mesmo problema como vc resolveu obrigado
GOSTEI 0
POSTAR