My Java Object is not persisted with all its XML attributes

Asked

Viewed 58 times

0

I’m using the JAXB API. I can persist right a java object in xml but only persist the attribute "Name" the rest of the attributes are not persisted. Here are my codes:

This is the method that saves the object in XML.

/**
 * Salva os dados do grupo atual no arquivo especificado.
 * 
 * @param file
 */
public void saveDataToFile(File file) {
    try {
        JAXBContext context = JAXBContext
                .newInstance(GruposListWrapper.class);
        Marshaller m = context.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        // Envolvendo nossos dados da pessoa.
        GruposListWrapper wrapper = new GruposListWrapper();
        wrapper.setGrupos(gruposData);

        // Enpacotando e salvando XML  no arquivo.
        m.marshal(wrapper, file);

        // Saalva o caminho do arquivo no registro.
        setFilePath(file);
    } catch (Exception e) { // catches ANY exception
        e.printStackTrace();
        Alert alert = new Alert(AlertType.ERROR);
        alert.setTitle("Error");
        alert.setHeaderText("Could not save data");
        alert.setContentText("Could not save data to file:\n" + file.getPath());
        alert.showAndWait();
    }
}

This is the Wrapper class

/**
* Classe auxiliar para envolver uma lista de grupos. Esta é usada para 
*salvar a lista de grupos em XML.
* 
* @author Marco Jakob
*/
@XmlRootElement(name = "grupos")
public class GruposListWrapper {

private List<Grupos> grupos;

@XmlElement(name = "grupo")
public List<Grupos> getGrupos() {
    return grupos;
}

public void setGrupos(List<Grupos> grupos) {
    this.grupos = grupos;
}
}   

The list to be saved is this:

private ObservableList<Grupos> gruposData = 
FXCollections.observableArrayList();

This is my class Groups:

public class Grupos implements Pesquisavel{
    private StringProperty nome;
    private StringProperty quantidadeProdutos;
    private StringProperty valorTotal;
    private List<Produtos> listaProdutos = new ArrayList<>();

    public Grupos() {
        this(null);
    }

    public Grupos(String nome) {
        this.nome = new SimpleStringProperty(nome);
        this.quantidadeProdutos = new SimpleStringProperty("10");
        this.valorTotal = new SimpleStringProperty("10");
    }

    public Grupos(String nome, String quantidadeProdutos, String valorTotal) {
        this.nome = new SimpleStringProperty(nome);
        this.quantidadeProdutos = new SimpleStringProperty(quantidadeProdutos);
        this.valorTotal = new SimpleStringProperty(valorTotal);
    }

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

    public void setQuantidadeProdutos() {
        this.quantidadeProdutos = new SimpleStringProperty(Integer.toString(getListaProdutos().size()));
    }

    public void setValorTotal() {
        Double novoValor = 0.0;
        for(Produtos x: getListaProdutos()) {
            novoValor += Double.parseDouble(x.getValor().get());
        }
        this.valorTotal = new SimpleStringProperty(Double.toString(novoValor));
    }

    public void setQuantidadeProdutos(String quantidade) {
        this.quantidadeProdutos = new SimpleStringProperty(quantidade);
    }

    public void setValorTotal(String valor) {
        this.valorTotal = new SimpleStringProperty(valor);
    }

    public StringProperty getNomeProperty() {
        return nome;
    }

    public StringProperty getQuantidadeProdutosProperty() {
        return quantidadeProdutos;
    }

    public StringProperty getValorTotalProperty() {
        return valorTotal;
    }

    public List<Produtos> getListaProdutos(){
        return listaProdutos;
    }

    @Override
    public String getNome() {
        return nome.get();
    }

    @Override
    public String getCodigo() {
        return null;
    }

    @Override
    public String toString() {
        return getNome();
    }


}

When I save in XML it always saves like this, no matter how much I change the attributes, how many changes I make, it always saves only the Group name in XML:

inserir a descrição da imagem aqui

1 answer

2

Your class Grupos also needs the JAXB notation for the XML to be applied to the lower nodes, since you want a list of objects.

Assuming a Groups class that will keep a list of objects in the Group class:

package test;

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="grupos")
@XmlAccessorType(XmlAccessType.FIELD)
public class Grupos {

@XmlElement(name="grupo")
List<Grupo> grupos = null;

public Grupos() {
    grupos = new ArrayList<>();
}

public List<Grupo> getGrupos() {
    return grupos;
}

public void setGrupos(List<Grupo> grupos) {
    this.grupos = grupos;
}
}

The Group class with its internal elements:

package test;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="grupo")
@XmlAccessorType(XmlAccessType.FIELD)
public class Grupo {
String atributo1;
String atributo2;
String atributo3;

public Grupo() {

}

public Grupo(String atributo1, String atributo2, String atributo3) {
    this.atributo1 = atributo1;
    this.atributo2 = atributo2;
    this.atributo3 = atributo3;
}

public String getAtributo1() {
    return atributo1;
}

public void setAtributo1(String atributo1) {
    this.atributo1 = atributo1;
}

public String getAtributo2() {
    return atributo2;
}

public void setAtributo2(String atributo2) {
    this.atributo2 = atributo2;
}

public String getAtributo3() {
    return atributo3;
}

public void setAtributo3(String atributo3) {
    this.atributo3 = atributo3;
}   
}

And in the main class, calling the method where the list was created first and passed to the Groups class:

package test;

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

import org.xml.sax.SAXException;

public class JaxbExample
{
public static void main(String[] args) throws SAXException, JAXBException
{
    objetoParaXml();
}

private static void objetoParaXml() throws JAXBException {
    //Criar lista de grupos
    List<Grupo> grupos = new ArrayList<>();
    grupos.add(new Grupo("at1","at2", "at3"));
    grupos.add(new Grupo("at4","at5","at6"));

    Grupos g = new Grupos();
    g.getGrupos().addAll(grupos);

    JAXBContext jaxbContext = JAXBContext.newInstance(Grupos.class);
    Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

    jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

    //Marshal os grupos para o console
    jaxbMarshaller.marshal(g, System.out);
}   

}

Returns the following result:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<grupos>
    <grupo>
        <atributo1>at1</atributo1>
        <atributo2>at2</atributo2>
        <atributo3>at3</atributo3>
    </grupo>
    <grupo>
        <atributo1>at4</atributo1>
        <atributo2>at5</atributo2>
        <atributo3>at6</atributo3>
    </grupo>
</grupos>

For more examples: see the first example here and another here and for a list of objects here.

  • It didn’t work that way, my xml looks like this: https://imgur.com/a/fP2LImg

  • Post your Modified Groups class.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.