Java EE 6 + EJB 3.1 + JSF 2 + JPA 2 + CDI + Maven

1 resposta
lupontes

Olá amigos, sou iniciante nessa composição de tecnologias listadas no assunto deste poste e até então, funcionou bem, porém, ao tentar integrar o JAAS Security na minha aplicação estou tendo a seguinte dificuldade:
Tentei injetar o ClienteServices numa extensão de uma classe do Jaas Security para tentar recuperar as regras de permissões dos clientes, pois, meu LDAP só armazena login e senha mas não está funcionando. Ficaria grato se você pudesse me dar uma “luz” sobre o que eu estou fazendo de errado. Segue o código da classe na qual estou tendo dificuldade:

package br.embrapa.cnpmf.emaps.cliente.services;

import java.io.Serializable;
import java.security.acl.Group;

import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;
import javax.security.auth.login.LoginException;

import org.jboss.security.auth.spi.LdapLoginModule;

@Named
@SessionScoped
public class CustomLDAPLoginModule extends LdapLoginModule implements Serializable {

	private static final long serialVersionUID = 2644327253799952198L;
	
	@Inject
	private ClienteServices clienteServices;
	
	@Override
	protected Group[] getRoleSets() throws LoginException {
		if (clienteServices != null)
			System.out.println(">>> não nulo");
		else
			System.out.println(">>> nulo");
		return super.getRoleSets();
	}

	@Override
	protected String getUsersPassword() throws LoginException {
		System.out.println(">>> getUsersPassword: " + super.getUsersPassword());
		return super.getUsersPassword();
	}

	@Override
	protected boolean validatePassword(String inputPassword,
			String expectedPassword) {
		boolean result = super.validatePassword(inputPassword, expectedPassword);
		return result;
	}

}

Nesse exemplo, a classe ClienteServices retorna null, sendo que no segundo exemplo abaixo, a mesma injeção funciona perfeitamente:

package br.embrapa.cnpmf.emaps.cliente.web.mb;

import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;

import javax.annotation.PostConstruct;
import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.context.FacesContext;
import javax.faces.context.Flash;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.commons.lang.StringUtils;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

import br.embrapa.cnpmf.emaps.cliente.entity.Cliente;
import br.embrapa.cnpmf.emaps.cliente.entity.ClienteTelefone;
import br.embrapa.cnpmf.emaps.cliente.entity.filter.ClienteFilter;
import br.embrapa.cnpmf.emaps.cliente.exception.ClienteExistenteException;
import br.embrapa.cnpmf.emaps.cliente.exception.NenhumTelefoneInformadoException;
import br.embrapa.cnpmf.emaps.cliente.services.ClienteServices;
import br.embrapa.cnpmf.emaps.common.entity.DadosPaginacao;
import br.embrapa.cnpmf.emaps.common.entity.DadosPaginacao.ModoOrdenacao;
import br.embrapa.cnpmf.emaps.common.web.UtilsMB;

@Named
@ConversationScoped
public class ClienteMB implements Serializable {
	private static final long serialVersionUID = 6920835789315490285L;

	// bundle com as mensagens internacionalizaveis
	private ResourceBundle bundle;

	@Inject
	private Conversation conversation;

	@Inject
	private ClienteServices clienteServices;

	@Inject
	private FacesContext facesContext;

	@Inject
	private UtilsMB utilsMB;

	private Cliente cliente = new Cliente();
	private Long idCliente;
	private LazyDataModel<Cliente> clientes;
	private String nomeBuscar;
	private ClienteTelefone telefoneAdd = new ClienteTelefone();
	private List<ClienteTelefone> telefones;

	/**
	 * Devolve a lista de clientes a ser mostrada no dataTable de acordo com os
	 * filtros da paginacao
	 * 
	 * @return
	 */
	public LazyDataModel<Cliente> getClientes() {
		if (clientes == null) {
			clientes = new LazyDataModel<Cliente>() {
				private static final long serialVersionUID = -2761376581835510122L;

				@Override
				public List<Cliente> load(int first, int pageSize,
						String sortField, SortOrder sortOrder,
						Map<String, String> filters) {
					// obtem a quantidade total de registros
					setRowCount(clienteServices
							.countByFilter(new ClienteFilter(nomeBuscar, null)));
					// recupera os registros de acordo com os dados de busca e
					// de paginacao
					return clienteServices
							.findByFilter(new ClienteFilter(
									nomeBuscar,
									new DadosPaginacao(
											first,
											pageSize,
											sortField,
											SortOrder.ASCENDING
													.equals(sortOrder) ? ModoOrdenacao.ASCENDING
													: ModoOrdenacao.DESCENDING)));
				}
			};
		}
		return clientes;
	}

...

Desde já obrigado pela paciência.

1 Resposta

S

Provavelmente a criação da classe pelo jboss não comporta CDI e está ignorando suas anotações. Acho que você vai ter que acessar os serviços via código mesmo

Criado 1 de outubro de 2013
Ultima resposta 3 de dez. de 2013
Respostas 1
Participantes 2