Service chamando outro Service
24/10/2012 12:40
0
Bom dia galera!

Seguinte, sobrescrevi o serivce default MyUserDetailsService do spring security... precisava fazer isso para autenticar no LDAP. Possuo um outro serviço, ambos funcionam normalmente como o esperado.
Como fazer com que o serviço A execute métodos do serviço B?

Tentei injetar normalmente, como se faz nos controllers por exemplo:


class Aservice{
def Bserivece

Bservice.metodo()

}


Porém sempre ocorre um erro de runtime exception durante a execução:

URI: /../j_spring_security_check
Class: java.lang.NullPointerException
Message: Cannot invoke method meuMetodo() on null object



Não sei mais como tentar solucionar este problema, estou fazendo algo errado? Isso acontece devido a forma que o grails realiza a injeção?
Tags: Service


1
O problema está no nome do atributo que você declarou.

Se sua classe se chama BService, você deve declará-la no service cliente como


class ClasseClienteService {
def bService

void facaAlgo() {
bService.faca()
}
}


0
Obrigado pela breve resposta Kiko... tinha acabado de descobrir essa restrição de nomenclatura, porém nada feito. =[

Vou postar abaixo o código do meu service do spring security (é onde ocorre o erro).


class MyUserDetailsService implements GrailsUserDetailsService {
def notificationsService
static final List NO_ROLES = [new GrantedAuthorityImpl(SpringSecurityUtils.NO_ROLE)]

UserDetails loadUserByUsername(String username, boolean loadRoles)

throws UsernameNotFoundException {
return loadUserByUsername(username)
}

UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

Usuario.withTransaction { status ->

Usuario user = Usuario.findByUsername(username)
if (!user) throw new UsernameNotFoundException(
'User not found', username)

def authorities = user.authorities.collect {
new GrantedAuthorityImpl(it.authority)
}
//limpa as notificações caso existam
notificationsService.limpaNotifications(user)

//retorna o details
return new MyUserDetails(user.username, user.firstName, user.surname, user.email, user.password,
user.enabled,
!user.accountExpired,
!user.accountLocked,
!user.passwordExpired,
authorities,
user.id)
}
}

}
24/10/2012 13:11


0
Problema "solucionado".

Não sei o motivo, mas o serviço não estava sendo injetado.
Anteriormente estava declarando o serviço da forma usual:


class MyUserDetailsService implements GrailsUserDetailsService {
def notificationsService
...
}


Porém sempre recebia um erro NPE. Então, resolvi apelar e fazer da seguinte forma:

class MyUserDetailsService implements GrailsUserDetailsService {
def notificationsService = new NotificationsService()
...
}


Funcionou... ele conseguiu acessar o método do serviço corretamente. Não sei o motivo do NPE anterior, acredito que talvez possa ser devido ao fato do meu serviço "chamador" implementar outro serviço, porém nao tenho certeza... estou chutando isso.

Em teoria um serviço chamando outro é para funcionar perfeitamente.

Bom, de qualquer forma esta "gambiarra" funcionou.

Caso alguém saiba o motivo do NPE inicial, ou conheça a forma elegante de corrigir este problema, me avise por favor.


[]'s

25/10/2012 13:38



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto