Estrutura genérica com JSF

Bom dia galera,

montei uma estrutura genérica de CRUD e vou postar aqui para a avaliação e critica de vcs:

Controller Genérico:

public abstract class GenericController<T extends BaseModel,Y extends GenericDao><T, Long>> {

	T objeto,filtro;
	List<T> listagem;
	private final Class<T> classeModel;
	boolean trazerTodos;
	public Y dao;
	public static String LISTAGEM = "";
	public static String CADASTRO ="";

	public GenericController(){
		setaNavegacao();
		this.classeModel = (Class<T>)
		((ParameterizedType)getClass().getGenericSuperclass())
		.getActualTypeArguments()[0];
	}

	public void limpar() throws InstantiationException, IllegalAccessException{
		listagem = new ArrayList<T>();
		objeto = classeModel.newInstance();
		filtro = classeModel.newInstance();
		trazerTodos = true;
	}

	public T getObjeto() {
		return objeto;
	}
	
	public void setObjeto(T objeto) {
		this.objeto = objeto;
	}

	public T getFiltro() {
		return filtro;
	}

	public void setFiltro(T filtro) {
		this.filtro = filtro;
	}

	String redirecionar(String pagina) throws InstantiationException, IllegalAccessException{
		limpar();
		return pagina;
	}
	
	public String novo() throws InstantiationException, IllegalAccessException{
		return redirecionar(CADASTRO);
	}
	
	public String listar() throws InstantiationException, IllegalAccessException{
		return redirecionar(LISTAGEM);
	}
	
	public String salvar(){
		String retorno = LISTAGEM;
		try{
			if(objeto.getId()==null){
				dao.salvar(objeto);}
			else{
				dao.atualizar(objeto);
			}
			MessageUtil.mostraMensagemSucesso();
		}catch(Exception e){
			retorno = "";
			MessageUtil.mostraMensagemErro();
		}
		return retorno;
	}

	public String editar(){
		return CADASTRO;
	}
	
	public void excluir(){
		String msgErro = "Problema ao excluir registro";
		try {
			dao.excluir(objeto);
			listagem.clear();
			MessageUtil.mostraMensagemSucesso();
		}catch(Exception e){
			e.printStackTrace();
			MessageUtil.addMessage(msgErro, FacesMessage.SEVERITY_ERROR);
		}
	}

	public List<T> getListagem() {
		if(listagem.size()==0 && trazerTodos) {
			listagem = dao.todos(null);
		}
		return listagem;
	}

	public void setListagem(List<T> listagem) {
		this.listagem = listagem;
	}

	public abstract void setaNavegacao();
	public abstract void injetaDao();
}

Controller Implementação:

@Component
@Scope("globalSession")
public class TutorController extends GenericController<Tutor,TutorDao>{
		
	public TutorController(){
		injetaDao();
	}
	
	final static String DAO_CONCRETO = "tutorDaoImp";
	
	@Override
	public void setaNavegacao() {
		LISTAGEM = "listarTutor";
		CADASTRO ="cadastrarTutor";
	}
	
	public void filtrar(){
		trazerTodos = false;
		listagem = dao.findByExample(filtro);
	}

	@Override
	public void injetaDao() {
		ApplicationContext ctx = AppContext.getApplicationContext();
		try{
			super.dao = (TutorDao) ctx.getBean(DAO_CONCRETO);
		}catch(Exception e){
			e.printStackTrace();
		}
		
	}


}

classe Model:

@Entity
@Table(name="tb_tutor")
public class Tutor extends BaseModel {

O que acharam?