Fórum Spring Security 3 - NullPointerException #428704
13/11/2012
0
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
Curtir tópico
+ 0Posts
14/11/2012
Thiago Volpato
Gostei + 0
19/11/2012
Davi Costa
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
19/11/2012
Thiago Volpato
e mais algumas conf. que ocorreu depois
vlw
[Resolvido]
Gostei + 0
21/11/2012
Thiago Volpato
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
21/11/2012
Davi Costa
Senão for, desconheço como fazer isso, teria que dar uma pesquisada
att Davi
Gostei + 0
21/11/2012
Thiago Volpato
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
10/06/2015
Jether Nascimento
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)