Fórum Validador customizado, utilizando um service #498636

21/10/2014

0

Olá, estou tentando utilizar um serviço dentro de um validador customizado, mas sem exito, alguem poderia me ajudar?
Minha idéia é a seguinte, no servicoUsuario tenho um método "getUsuarioPorLogin", e estou tentando fazer uma verificação onde através do login passado no cadastro ele utiliza esse método, caso seja retornado um valor NULL deixo o método de validação isValid como true, caso contrário false.

Porém algo de errado está acontecendo, abaixo vai o código da classe do validador customizado:

public class LoginPadraoValidator implements
		ConstraintValidator<LoginPadrao, String> {

	
	private ServicoUsuario servicoUsuario;
	
	

	@Override
	public void initialize(LoginPadrao constraintAnnotation) {
		
		constraintAnnotation.message();

	}

	@Override
	public boolean isValid(String value, ConstraintValidatorContext context){
		try{
		return(servicoUsuario.getUsuarioPorLogin(value).equals(null));
		}
		catch(NullPointerException ex){
			System.out.println("ok, nulo então não existe nenhum usuario com esse login certo?!?!?");
			return true;
		}
		
	}
	



}


O que está acontecendo é que ele sempre "cai" no catch mesmo colocando um login já existente, alguma luz? isso é possível ou estou indo pelo caminho errado?

Valeu, até mais!

Leia mais em: Validadores Personalizados no Cadastro de Usuários - Curso de Java EE: Construa uma aplicação completa Java EE - Aula 40 https://www.devmedia.com.br/validadores-personalizados-no-cadastro-de-usuarios-curso-de-java-ee-construa-uma-aplicacao-completa-java-ee-aula-40/30961#ixzz3GohmDWTt
Bruno Santana

Bruno Santana

Responder

Posts

21/10/2014

Ronaldo Lanhellas

Verifica se o seu objeto "ServicoUsuario" não está nulo antes de chamar o método "getUsuarioPorLogin()", caso esteja você deve verificar se está realizando a injeção de dependência no mesmo (partindo do princípio que você esta usando um framework para isso).
Responder

Gostei + 0

21/10/2014

Bruno Santana

Opa Ronaldo, valeu novamente!!!! Tinha acabado de perceber isso porém não estou conseguindo realizar essa injeção, o serviço realmente está nulo... Estou utilizando CDI nesse projeto mas to apanhando nessa parte :S já utilizei CDI nos "controles" da camada de aplicação, mas pra essa etapa estou penando acho que pela falta de experiencia... tentei utilizar o @Inject no servicoUsuario e até a anotação @PostConstruct em um método inicializar() mas acho que estou fazendo algo errado, o erro continua sempre o mesmo, na verdade nem erro acontece, simplesmente cai no catch... alguma luz? Ou vc poderia citar algum link ou exemplo básico de alguma injeção de dependencia de um serviço em um validador ?
Obs, meu serviço é um EJB...


Valeu pela força Ronaldo!!!
Responder

Gostei + 0

22/10/2014

Ronaldo Lanhellas

Você terá que usar um factory para isso, veja: https://github.com/hibernate/hibernate-validator/blob/master/cdi/src/main/java/org/hibernate/validator/internal/cdi/InjectingConstraintValidatorFactory.java
Responder

Gostei + 0

22/10/2014

Bruno Santana

Opa, não consegui entender muito bem esses códigos, é necessário uma factory então para conseguir injetar um serviço dentro de um validador customizado ?!
Acabei "resolvendo" o problema de outra maneira, apliquei essa verificação dentro do próprio serviço na chamada do método em questão. O código do serviço ficou da seguinte forma

@Stateless
@LocalBean
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@TransactionManagement(TransactionManagementType.CONTAINER)
public class ServicoUsuario extends ServicoBasico {

   public Usuario addUsuario(Usuario usuario) throws LoginPadraoException{
    	if(repositorioUsuario.getUsuarioPorLogin(usuario.getUsuLogin()) != null){
    		throw new LoginPadraoException();
    	}
    	return repositorioUsuario.addUsuario(usuario);
    }	


Não sei se essa foi a forma mais elegante, mas consegui realizar a verificação de login (tratando algumas exceções que foram chamadas durante a verificação pois o mesmo retornava um objeto NULL) fazendo da forma acima. A "bad" é que a verificação é feita apenas no final do cadastro do usuário, diferente caso fosse feita através de um validador customizado e utilizado diretamente na entidade(como no primeiro post)... a mensagem de "LOGIN JA EXISTENTE" apareceria logo ao "setar" o campo usuLogin... Então é isso Ronaldo? não há maneira de injetar um serviço (EJB) como esse "ServicoUsuario" dentro de um validador customizado (citado no primeiro post) sem a utilização de factory?!??! Caso não, vou tentar deixar essa soluçao para depois, não consegui entender esses códigos auhauahuahuahuah õ.o ://
Responder

Gostei + 0

23/10/2014

Ronaldo Lanhellas

Acontece que o seu ServicoUsuario não está sendo gerenciado pelo CDI e sem assim não consegue gerenciar os atributos dentro dele, por isso fica nulo. A solução é usar o factory mas se você está sem tempo para estudar a solução, pense nela com calma depois.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar