8
respostas

Problema ao fazer annotation 2 parte do Reflection

Boa noite estou com problema na impressão dos dados para xml, gostaria de uma ajuda, não sei se pode me ajudar que faço o curso na IDE Netbeans, e na impressão não sai com as anotações, Imprime apenas com fqn.

package br.com.alura.estoque.anotacao;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 *
 * @author marcosparreira
 */
@Retention(RetentionPolicy.RUNTIME)//qual tempo ira executar essa anotacion no caso irei passar configuracao em timpo de execucao
@Target({ElementType.TYPE, ElementType.FIELD})//passar onde era ira funcionar em ... em um metodo ou em um atributo, num parametro.... no caso iremos passar um arrays que iremos usar mais de um lugar... no caso Element.type podemos usar no lugar de uma declaracao de uma classe e ElementField em um atributo qualquer
public @interface NomeTagXML {
    //valor passado na anotacao xml... nome conteudo, conversao de usar value, para apenas 1 atributo
     public String value();

}

package br.com.alura.alurator.conversor;

import br.com.alura.alurator.convesor.anotacao.NomeTagXML; import java.lang.reflect.Field; import java.util.Collection;

/** *

  • @author marcosparreira */ public class ConversorXML {

    public ConversorXML() { }

    public Object converte(Object objeto) {

     try {
         Class<?> classeObjeto = objeto.getClass(); //pegando objeto da classe
    
         StringBuilder xmlBuilder = new StringBuilder();
    
         if (objeto instanceof Collection) { //verificando objeto e instancia de Collection, esse medoto serve quando for passado uma lista  ele consiga converter pra xml
             Collection<?> colecao = (Collection<?>) objeto;
    
             xmlBuilder.append("<lista>");
    
             for (Object o : colecao) {
                 String xml = (String) converte(o);
                 xmlBuilder.append(xml);
             }
    
             xmlBuilder.append("</lista>");
    
         } else {
             // Verificando se nossa classe em questao esta usando usando tagXML, se tiver ira vim representando a nossa tag ussada na anotacao, se nao ira retornar null
             NomeTagXML anotacaoClasse = classeObjeto.getDeclaredAnnotation(NomeTagXML.class);
             //aqui verifico retorno se anotacao vier null(quer dizer q minha classe nao representa nenhuma anotacao xml), no caso retornatia full qualyfydy name da classe,
             String nomeClasse = 
                     anotacaoClasse == null
                     ? classeObjeto.getName()
                     : anotacaoClasse.value();//se tudo estiver representado serto na classe retorna xml da classe
    
             xmlBuilder.append("<" + nomeClasse + ">");
    
             for (Field atributo : classeObjeto.getDeclaredFields()) {
                 atributo.setAccessible(true);
                 //declarando minha anotacao agora os atributos, se a classe fizer parte das anotaçoes
                 NomeTagXML anotacaoAtributo = atributo.getDeclaredAnnotation(NomeTagXML.class);
    
                 String nomeAtributo = 
                         anotacaoAtributo == null
                         ? atributo.getName()
                         : anotacaoAtributo.value();
    
                 Object valorAtributo = atributo.get(objeto);  
    
                 xmlBuilder.append("<" + nomeAtributo + ">");
                 xmlBuilder.append(valorAtributo);
                 xmlBuilder.append("</" + nomeAtributo + ">");
            }

            xmlBuilder.append("</" + nomeClasse + ">");
        }

        return xmlBuilder.toString();

    } catch (IllegalArgumentException | IllegalAccessException ex) {
        ex.printStackTrace();
        throw new RuntimeException("Erro na geração do XML");
    }
}

/* pra quem passa lista no metodo converte exemplo que pode passar objeto ou lista
Produto 1 20.0 Marca 1
    <produto>
     <nome> Produto 2 </nome>
     <valor> 20.0 </valor>
     <marca>Marca 2 </marca>
    </produto>

 */

}


8 respostas

saída do println

/produto/lista
[Produto [nome=Produto 1, valor=20.0, marca=Marca 1], Produto [nome=Produto 2, valor=30.0, marca=Marca 1], Produto [nome=Produto 3, valor=40.0, marca=Marca 2]]
Response: <lista><br.com.alura.estoque.modelo.Produto><nome>Produto 1</nome><valor>20.0</valor><marca>Marca 1</marca></br.com.alura.estoque.modelo.Produto><br.com.alura.estoque.modelo.Produto><nome>Produto 2</nome><valor>30.0</valor><marca>Marca 1</marca></br.com.alura.estoque.modelo.Produto><br.com.alura.estoque.modelo.Produto><nome>Produto 3</nome><valor>40.0</valor><marca>Marca 2</marca></br.com.alura.estoque.modelo.Produto></lista>

Boa noite, Marcos! Como vai?

Aparentemente vc esqueceu de utilizar a anotação criada ( NomeTagXML ) na classe Produto! Mas pra ter certeza eu terei que dar uma olhada no código dessa classe!

Sendo assim, vc poderia postar aqui a sua classe Produto? Quando for postar o código, utilize o botão "inserir código" e cole o código no lugar indicado.

Bem amigo, então esta anotado sim.

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.alura.estoque.modelo;

import br.com.alura.estoque.anotacao.NomeTagXML;

/**
 *
 * @author marcosparreira
 */
@NomeTagXML("product")
public class Produto{
    @NomeTagXML("name")
    private String nome;
    @NomeTagXML("value")
    private double valor;
    @NomeTagXML("brand")
    private String marca;

    public Produto(String nome, double valor, String marca) {
        this.nome = nome;
        this.valor = valor;
        this.marca = marca;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public double getValor() {
        return valor;
    }

    public void setValor(double valor) {
        this.valor = valor;
    }

    public String getMarca() {
        return marca;
    }

    public void setMarca(String marca) {
        this.marca = marca;
    }

    @Override
    public String toString() {
        return "Produto [nome=" + nome + ", valor=" + valor + ", marca=" + marca + "]";
    }

}

Opa, Marcos! O código parece estar OK!

Vc chegou a testar esse código no Eclipse pra ver se funciona? Se sim, qual foi o resultado?

baixei o eclipse e rodei a aplicação, mas também não funcionou a anotações. Saida ficou igual netbeans 11, Quer q subo a aplicação para gitHub? pra vc dar uma olhada.

Opa, Marcos! Manda o código do projeto do Eclipse pro Github e compartilha o link aqui, por favor! Eu darei uma olhada a fundo pra procurar o que é que tá bagunçando esse meio de campo aí!

https://github.com/marcosparreira10/Reflection

continuei com código, com as aulas, esta dando outro erro. /produto/lista java.lang.NoSuchMethodException: br.com.alura.estoque.controle.ProdutoController.() at java.base/java.lang.Class.getConstructor0(Class.java:3355) at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2559) at br.com.alura.alurator.reflexao.ManipuladorClasse.getConstrutorPadrao(ManipuladorClasse.java:26) at br.com.alura.alurator.reflexao.ManipuladorClasse.criaInstancia(ManipuladorClasse.java:36) at br.com.alura.alurator.Alurator.executa(Alurator.java:35) at br.com.alura.estoque.Main.main(Main.java:35) Exception in thread "main" java.lang.RuntimeException: java.lang.NoSuchMethodException: br.com.alura.estoque.controle.ProdutoController.() at br.com.alura.alurator.reflexao.ManipuladorClasse.getConstrutorPadrao(ManipuladorClasse.java:31) at br.com.alura.alurator.reflexao.ManipuladorClasse.criaInstancia(ManipuladorClasse.java:36) at br.com.alura.alurator.Alurator.executa(Alurator.java:35) at br.com.alura.estoque.Main.main(Main.java:35) Caused by: java.lang.NoSuchMethodException: br.com.alura.estoque.controle.ProdutoController.() at java.base/java.lang.Class.getConstructor0(Class.java:3355) at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2559) at br.com.alura.alurator.reflexao.ManipuladorClasse.getConstrutorPadrao(ManipuladorClasse.java:26) ... 3 more

vou te mandar código atualizado com esse erro. Desconsidere outro link olha esse por favor.

https://github.com/marcosparreira10/Reflection