Casting de String para Class<?>

9 respostas
D

Galera, coomo faço um Casting de String para ???

uma classe que eu não sei?

é pq to com um método para retornar o tipo da chave primaria da tabela.
Pode ser Integer, Double, String …

como faço esse casting? tentei assim:

@SuppressWarnings("unchecked")
			@Override
			public T getRowData(String key) {				
				return getBaseService().findOne(  (PK) getPrimaryKeyDeclaringClass().cast(key) );
			}

mas não dá certo (Exception):

INFO: java.lang.ClassCastException: Cannot cast java.lang.String to java.lang.Integer
java.lang.ClassCastException: Cannot cast java.lang.String to java.lang.Integer
	at java.lang.Class.cast(Class.java:3005)
	at br.com.noronha.infra.abstractt.AbastractController$1.getRowData(AbastractController.java:60)

9 Respostas

P

O que seria esse T?

Trate tudo como objetos e depois faça o cast. Então coloque o tipo de retorno como Object , e quando for chamar o getRowData() faça o cast.

R

de que tipo é T ?
so sabendo o que é T é que podemos te ajudar para saber se fazemos refactoring ou outra coisa

O teu erro é legitmo, não é possivel fazer Cast de String para Integer

D

T é genérico :slight_smile:

eu não sei de qual tipo… Mas o problema não é no T …

o problema é que:

return getBaseService().findOne( );

recebe como parametro um PK que é o tipo da chave primaria do T…

Aí eu faço:

(PK) getPrimaryKeyDeclaringClass().cast(key)

pra pegar qual o tipo da chave primaria (no caso Integer).
Só que recebo uma String por parametro…

:frowning:

D

PS: não posso mudar na estrutura pois estou fazendo um @Override :frowning:

e não sou eu quem chamo os métodos, e sim o framework

(p:datatable do jsf)

**lazy loading

R

Porque não tentas fazer um parse de tipos em vez de Cast ?

D

seria legal fazer o parse…
mas como vou fazer o parse se eu não sei qual tipo é??? O.o’

M

Você pode carregar uma classe a partir de seu nome completo. Vamos por exemplo, para a classe Long.

Class clazz = Class.forName("java.lang.Long");

Agora criemos um Object e inicializemos ele com 5l:

Object obj = 5l

Façamos o cast desse objeto para long usando a classe carregada:

Long l = (Long) clazz.cast(obj);

Perceba que esse processo é sujo e perigoso. Qualquer coisa a sua aplicação pode lançar um CastClassException ou um ClassNotFundException.

Você tem que carregar os dados dessa forma mesmo? Não está usando nenhum framework de mapeamento de dados?

R

Será que podes nos mostrar todo o seu problema… assim facilmente o ajudamos na solução

D

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!
:slight_smile: Facilidade no desenvolvimento kkkkk
Mas até chegar lá… to apanhando

Criado 28 de outubro de 2012
Ultima resposta 29 de out. de 2012
Respostas 9
Participantes 4