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<Usuario> usuarios;
@Autowired
private UsuarioService usuarioService;
@Override
public List<Usuario> load(int inicio, int maxResults, String sortField, SortOrder sortOrder, Map<String, String> 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
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