Spring Security 3 - NullPointerException
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:
persistence.xml :
[b]Separei a configuração do spring em 2 duas partes [/b]
db.xml
applicationContext-security.xml
LoginBean
Classe AuthenticationService
Alguém me ajuda?
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
Curtidas 0
Respostas
Thiago Volpato
13/11/2012
Alguém??
GOSTEI 0
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
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
13/11/2012
Era isso msm
e mais algumas conf. que ocorreu depois
vlw
[Resolvido]
e mais algumas conf. que ocorreu depois
vlw
[Resolvido]
GOSTEI 0
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
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
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
Senão for, desconheço como fazer isso, teria que dar uma pesquisada
att Davi
GOSTEI 0
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
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
13/11/2012
Olá Thiago estou com o mesmo problema como vc resolveu obrigado
GOSTEI 0