Seguinte pessoal, tem alguns componentes que criei utilizando este tutorial.
Eles sempre funcionaram, até que há pouco tempo eu separei minha aplicação em algumas (antes era tudo uma coisa só), o que não deveria interferir nisso.
O Fato é que aproveitei pra mexer no cabeçalho dos web deployers (web.xml) que estava para a versão 2.4 e coloquei tudo 2.5
O lance é que o erro ocorre apenas em algumas páginas que utilizam o meu componente, foi então que vi a linha que causava o erro, era uma linha do facelets, então baixei o fonte do facelets e fui debugar
nos anexos segue um passo a passo das coisas que conferi inumeras vezes e não me conformo por que isso da erro
Na imagem um vocês podem ver a linha que gera o exception, é um illegalArgumentException
http://geocities.yahoo.com.br/rafaelrfelipe/dossie/1_linhaProblematica.jpg
O que essa linha faz nada mais é do que chamar o metodo setForId do meu componente via reflection
na imagem 2 vocês podem ver que o valor passado está correto, a assinatura do metodo aceita só um argumento do tipo string, logo o valor é um Object[] e o primeiro elemento é um String.
http://geocities.yahoo.com.br/rafaelrfelipe/dossie/2_atributoValue.jpg
Na imagem 3 vocês podem ver que o atributo passado é uma instancia da minha classe, que possui o atributo forId (que é String)
http://geocities.yahoo.com.br/rafaelrfelipe/dossie/3_instance.jpg
Na imagem 4 vocês podem ver a instancia do objeto que representa o metodo da classe, como podem reparar, a assinatura do método é compatível, retorna void e recebe uma unica string
http://geocities.yahoo.com.br/rafaelrfelipe/dossie/4_method.jpg
Na imagem 5 o exception que essa execução gera
http://geocities.yahoo.com.br/rafaelrfelipe/dossie/5_exception.jpg
e na imagem 6 o erro q sai na tela
http://geocities.yahoo.com.br/rafaelrfelipe/dossie/6_telaErro.jpg
será que alguém tem alguma idéia do que posso fazer pra tentar fazer esse erro parar de acontecer?
Primeiro imaginei que poderia ser versão do java, pois o jar que contém o componente tinha sido compilado para ser compatível com a versão 1.6 e a aplicação que o usava estava configurada pra rodar usando 1.5 compatibility, mas então troquei tudo de tudo pra 1.6, fiz 512 mil cleans diferentes pra não ter erro de ser cache e não resolveu! Coloquei todas as classes do meu componente como serializaveis e declarei o serialVersionID gerado pelo eclipse, achando que assim ele poderia entender a compatibilidade de classes (sei lá, to desesperado já)
qualquer sugestão é bem vinda
Na maquina de um outro rapaz daqui onde trabalho, uma página onde o componente funciona aqui, não funciona lá. E as que não funcionam aqui, funcionam lá!
Diferenças entre as duas, uso o eclipse ganymede ele usa o europa, o tomcat foi copiado do meu, mas não sei dizer se desde que ele copiou mudou algo. Acho q vou fazer ele copiar o meu de novo pra ver no que dá.
Acabei de fazer um teste aqui:
Object instance = new UIHelper();
Method method = UIHelper.class.getMethod("setForId", String.class);
Object[] value = new Object[]{"apelido"};
try {
method.invoke(instance, value);
} catch (InvocationTargetException e) {
System.out.println("Exception 1"+e.getMessage());
} catch (Exception e) {
System.out.println("Exception 2"+e.getMessage());
}
System.out.println(instance);
Faz praticamente a mesma coisa que a linha que da erro, mas funciona, isso ta num metodo main!