LazyDataModel do Primefaces, não me deixa injetar as dependencias do Spring

Pessoal, estou com uma classe que estende de LazyDataModel para poder utilizar a paginação do Primefaces data table. Mas na classe do LazyDataModel, o meu @Autowired não funciona. A classe está anotada com o @Component.

Codigo da classe:

[code]@Component
public class UsuarioLazyList extends LazyDataModel<Usuario> {

private static final long serialVersionUID = 8627494132635560011L;

private FiltroUsuarioTO filtroUsuarioTO;

private List&lt;Usuario&gt; usuarios;

@Autowired
private UsuarioService usuarioService;


@Override
public List&lt;Usuario&gt; load(int inicio, int maxResults, String sortField, SortOrder sortOrder, Map&lt;String, String&gt; fields) {
	try{
		usuarioService.consultarUsuariosFiltro(this.filtroUsuarioTO, inicio, maxResults);
	}catch(Exception e){
		e.printStackTrace();
	}
	return usuarios;
}

public FiltroUsuarioTO getFiltroUsuarioTO() {
	return filtroUsuarioTO;
}

public void setFiltroUsuarioTO(FiltroUsuarioTO filtroUsuarioTO) {
	this.filtroUsuarioTO = filtroUsuarioTO;
}[/code]

Opá, eu estou fazendo assim :


public class ParticipLazyList extends LazyDataModel<Participante> {
    private static final long serialVersionUID = 1L;
    private List<Participante>  participantes;    
    @Inject
    private UsuarioFace             userLogado;

    @Override
    public List<Participante> load(int idFirst, int idMax, String string, SortOrder so, Map<String, String> filters) { 
        try {
            ParticipanteSession bean = null;
            UsuarioFace userLogado   = null;
            ParticipanteFace participanteFace = null;       

            try {
                bean = getFacadeWithJNDI(ParticipanteSession.class);
                userLogado = getFacadeWithJNDI(UsuarioFace.class);            
                participanteFace = getFacadeWithJNDI(ParticipanteFace.class);                        
            } catch (NamingException ex) {
                Logger.getLogger(ParticipLazyList.class.getName()).log(Level.SEVERE, null, ex);
            }

			participantes = bean.getParticipLazyByCodigo(idFirst, idMax, userLogado.getLoggedUser().getEmpresa().getId());

            if(getRowCount() <= 0 ) {
                setRowCount(bean.getCountParticipTot(userLogado.getLoggedUser().getEmpresa().getId()));
            }        
            setPageSize(idMax);
        
        } catch (Exception e) {  
            System.out.println("Erro ao paginar... Mensagem de erro: "+ e.getMessage());  
        }         
        
        return participantes;
    }

    @Override    
    public Object getRowKey(Participante participante) {
        return participante.getId();
    }
    
   @Override
    public Participante getRowData(String participanteId) {
        Integer id = Integer.valueOf(participanteId); 
        for (Participante participante : participantes) {
            if(id.equals(participante.getId())){
                return participante;
            }
        } 
        return null;
    }    
    
    public <T> T getFacadeWithJNDI(Class<T> classToFind) throws NamingException {
        BeanManager bm = getBeanManager();
        Bean<T> bean = (Bean<T>) bm.getBeans(classToFind).iterator().next();
        CreationalContext<T> ctx = bm.createCreationalContext(bean);
        T dao = (T) bm.getReference(bean, classToFind, ctx);
        return dao;
    }

    private BeanManager getBeanManager() throws NamingException {
        try {
            InitialContext initialContext = new InitialContext();
            return (BeanManager) initialContext.lookup("java:comp/BeanManager");
        }
        catch (NamingException e) {
            e.printStackTrace();
            return null;
        }
    }
}

Vi a forma que você postou, mas infelizmente ela não se encaixa na minha arquitetura, teria q ou acrescentar ou trocar algumas coisas, e não é relevante.

Cara,

passei pelo mesmo problema que você…

E vou postar minha solução.

PS: eu fiz um BaseLazyModel que é genérico para todas as minhas entidades…
(Isso pq monto a query dinamicamente usando criteria hibernate)

public class BaseLazyModelJPA<T, PK extends Serializable> extends LazyDataModel<T> {

	private Class<T> entityClass;

	private BaseService<T, PK> baseService;

No meu controller (managedBean) eu simplesmente faço:

	private LazyDataModel<Pessoa> lazyModel;

	@PostConstruct
	public void init() {
		lazyModel = new BaseLazyModelJPA<Pessoa, Integer>(pessoaService, Pessoa.class, hibernateService);
	}

espero ter ajudado !

Opa amigo. Nesse caso esse seu baseService esta sendo gerenciado pelo spring certo?

Sim.

O Spring manda em tudo aqui na minha aplicação :slight_smile:

Fiz exemplo que nem o seu. Mas encontrei o maldito, LazyInitializationException, pois carrego uma lista de objetos desses meus objetos.

Tem algum modo de contornar isso, fiz aqui com o Hibernate.initialize. Mas como meu metodo retorna uma lista, teria q fazer o foreach em cada objeto fazendo sua inicialização.

[quote=darksteel3000]Fiz exemplo que nem o seu. Mas encontrei o maldito, LazyInitializationException, pois carrego uma lista de objetos desses meus objetos.

Tem algum modo de contornar isso, fiz aqui com o Hibernate.initialize. Mas como meu metodo retorna uma lista, teria q fazer o foreach em cada objeto fazendo sua inicialização.[/quote]

então cara
sempre qndo vou carregar uma lista lazy eu faço assim ó:

Pais paisCarregado = paisService.carregarPaisComEstados(pais);

aí lá nesse metodo, tenho um hql simples

Select p from Pais p left join fetch p.estados where o = ?1

:slight_smile: