Erro java.lang.NoSuchMethodError + Toplink [RESOLVIDO]

3 respostas
nei.junior

E ai pessoal, blz ?

Seguinte, abaixo tem um exemplo simples e o mais próximo do meu problema para que consigam entender.
Estou utilizando Netbeans 6.5 + TopLink Essentials + Glassfish + JSF.

Tenho uma classe Pai e uma classe Filho. Dentro da classe Pai, contém uma lista da classe Filho com o mapeamento OneToMany Bidirecional. Sendo assim na classe Pai ficou da seguinte forma:
@OneToMany(mappedBy="pai", cascade=CascadeType.ALL)
    private List<Filho> filhos;
E na classe Filho ficou da seguinte forma:
@ManyToOne
    @JoinColumn(name="idPai")
    private Pai pai;

    //Get e Set
    public Pai getPai() {
        return pai;
    }

    public void setPai(Pai pai) {
        this.pai = pai;
    }
Portanto, em um momento da minha aplicação quando estou cadastrando um Pai, posso cadastrar várias registros Filhos. Com isso tenho um sub-cadastro dentro do cadastro Pai onde preencho os dados do Filho e mando adicionar o mesmo na lista de Filho. O método para adicionar um Filho esta da seguinte forma:
public void adicionarFilho(ActionEvent event) {
        if (this.getPai().getFilhos() == null) {
            this.getPai().setFilhos(new ArrayList<Filho>());
        }
        /* Verifica se ja existe email na lista.
         - Caso sim, atualiza objeto na lista utilizando index.
         - Caso não, adiciona objeto na lista. */
        if (this.getPai().getFilhos().contains(filho)) {          
            this.getPai().getFilhos().set(this.getPai().getFilhos().indexOf(filho), filho);
        } else {
            filho.setPai(this.getPai);
            this.getPais().getFilhos().add(filho);
        }
    }
Quando mando adicionar, ao chegar na linha "filho.setPai(this.getPai);" esta apresentando o erro abaixo:
Caused by: java.lang.NoSuchMethodError: br.com.x.modelos.Filho._toplink_setPai(Lbr/com/x/modelos/Pai;)V
        at br.com.x.modelos.Filho.setPai(Filho.java:284)
        at br.com.x.controles.MbPais.adicionarFilho(MbPais.java:553)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at com.sun.el.parser.AstValue.invoke(AstValue.java:187)
        at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297)
        at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)
        at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:88)
        ... 48 more
Fiz várias pesquisas na net, encontrei vários posts parecidos com esse e alguns falavam que deveria colocar o Fetch no mapaeamento que resolveria; Outros falavam que poderia ter duas classes Filho em pacotes diferentes; Outros falavam que era problema com versões de Jars, Enfim, testei todos os procedimentos e nada feito. Só com relação a versão dos Jars que ainda não consegui ver em que jar pode ser o problema. Verifiquei no log e na mensagem não mostra nada mais do que o erro acima, então não sei qual jar poderia ser o problema. Portanto não sei o que pode ser.

[color=red]IMPORTANTE:[/color] Tenho uma outra classe (exemplo: "Filho 2") que faz exatamente o mesmo procedimento da classe Filho, com o mesmo relacionamento, porém esta adiciona normalmente. Não apresenta o erro no momento do set igual a essa que postei acima.
Já verifiquei se poderia ter algo de diferente, já refiz o relaciomento e nada. As duas estão exactamente iguais.

Alguem tem alguma ideia do que pode ser ?
Porque em uma funciona e na outra não ?

Aguardo e Obrigado !

3 Respostas

nei.junior

Ninguem ?

nei.junior

Ae pessoal, ninguém tem uma ideia do que pode ser este problema ?

nei.junior

Pessoal !

Consegui resolver o problema. Para quem estiver com o mesmo, segue abaixo:

No meu relacionamento ManyToOne da classe Pai na classe Filha, adicionei o atributo “fetch=FetchType.LAZY”. Ficando da seguinte forma:

@ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="idPai") private Pai pai;
Achei essa explicação em um post do glassfich, onde o mesmo foi aberto como BUG. A explicação dada esta da seguinte forma:

“The problem is that weaving is done on fields that don’t use lazy, but when
TopLink Essentials goes to add convenience methods, it assumes that only fields
marked Lazy are woven.”

Para mais detalhes, vejam o link:
https://glassfish.dev.java.net/issues/show_bug.cgi?id=2546

Criado 21 de outubro de 2009
Ultima resposta 9 de nov. de 2009
Respostas 3
Participantes 1