Galera, valeu pela ajuda…
eu já falei o problema… mas vou contextualizar então…
o negócio é o seguinte: tô criando um controller genérico e abstrato para jsf. Como eu estou usando primefaces
e vou usar o lazy loading eu tenho que sobrescrever esta classe:
LazyDataModel
Como é feito aqui:
https://github.com/ova2/primefaces-cookbook/blob/master/src/main/java/org/primefaces/cookbook/model/chapter5/LazyCarDataModel.java
Então é isso!! Tenho que sobrescrever esses métodos aí com @Override e estou tentando sobrescreve-los com generics e reflection.
querem ver a classe como está?
Lá vai:
package br.com.noronha.infra.abstractt;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;
import javax.persistence.Id;
import org.primefaces.context.RequestContext;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;
import br.com.noronha.infra.JSFMessageUtil;
public abstract class AbastractController<T, PK extends Serializable> {
private final JSFMessageUtil messageUtil = new JSFMessageUtil();
private final BaseService<T, PK> baseService;
private T entity;
private LazyDataModel<T> lazyModel;
protected Class<?> getPrimaryKeyDeclaringClass(){
Class<?> type = entity.getClass();
for (Field f : type.getDeclaredFields()) {
if (f.isAnnotationPresent(Id.class)) {
return f.getType();
}
}
return null;
}
@SuppressWarnings("serial")
public AbastractController(BaseService<T, PK> baseService, T entity) {
super();
this.entity = entity;
this.baseService = baseService;
this.lazyModel = new LazyDataModel<T>() {
@Override
public List<T> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,String> filters) {
int page = 1;
int total = (int) getBaseService().countRows();
this.setRowCount( total );
return getBaseService().findAll(page, pageSize).getContent();
}
@SuppressWarnings("unchecked")
@Override
public T getRowData(String key) {
return getBaseService().findOne( (PK) getPrimaryKeyDeclaringClass().cast(key) );
}
@Override
public Object getRowKey(T obj) {
Object id = null;
Class<?> type = obj.getClass();
for (Field f : type.getDeclaredFields()) {
if (f.isAnnotationPresent(Id.class)) {
String name = f.getName();
String method = "get" + name.substring(0, 1).toUpperCase()
+ name.substring(1);
try {
Method m = type.getDeclaredMethod(method);
id = (Object) m.invoke(obj);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return id;
}
};
}
@SuppressWarnings("unchecked")
public void onRowSelect(SelectEvent event) {
entity = (T) event.getObject();
System.out.println(entity == null? "null" : entity);
}
public void saveOrUpdate() {
try {
getBaseService().save(entity);
displayInfoMessageToUser("Saved With Sucess");
reset();
} catch (Exception e) {
displayErrorMessageToUser("Ops, we could not create. Try again later");
e.printStackTrace();
}
}
public void delete() {
try {
getBaseService().delete(entity);
displayInfoMessageToUser("Deleted With Sucess");
reset();
} catch (Exception e) {
displayErrorMessageToUser("Ops, we could not delete. Try again later");
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
public void reset() throws Exception {
entity = (T) entity.getClass().newInstance();
}
public T getEntity() {
return entity;
}
public void setEntity(T entity) {
this.entity = entity;
}
public LazyDataModel<T> getLazyModel() {
return lazyModel;
}
public void setLazyModel(LazyDataModel<T> lazyModel) {
this.lazyModel = lazyModel;
}
protected void displayErrorMessageToUser(String message) {
this.getMessageUtil().sendErrorMessageToUser(message);
}
protected void displayInfoMessageToUser(String message) {
this.getMessageUtil().sendInfoMessageToUser(message);
}
protected RequestContext getRequestContext() {
return RequestContext.getCurrentInstance();
}
public BaseService<T, PK> getBaseService() {
return baseService;
}
public JSFMessageUtil getMessageUtil(){
return messageUtil;
}
}
Calma que tem mta coisa incompleta… Por exemplo o método load eu aidna não to passando a pagina certa pro meu baseService… pq estou tendo problema pra integrar com o Spring Data: http://www.guj.com.br/java/285832-spring-data-vs-lazy-loading-primefaces
Mas por aí vai… Quando eu terminar, qqer crud que eu queira criar basta extender o abstractController… sobrescrever se tiver alguma mudançaa e pronto!
Facilidade no desenvolvimento kkkkk
Mas até chegar lá… to apanhando