(JAXB) Recover XML file in the input fields of a Jswing form with Unmarshalling

Asked

Viewed 204 times

0

I am new and I started to learn these XML days because of an implementation that should have in my application, I did some tests with Mashall and unmarshall in the main class first (see at the end) to better understand, I am making a form that should have the following operation: The user clicks on the Search XML button then selects a file in the XML format of some system folder to then import it into the application where it will be read by each text field, what I am trying to do is when it imports it into the system it can be read and in each tag being its value it is loaded into one of the input boxes (Jtextfield, Jcombobox)...

Example:

<Pedido>
   <pedidos>
   <pedido id = "1">
      <dataCadastro>3917-04-11T00:00:00-03:00</dataCadastro>  <!-- tfDataCadastro: getText(); -->
      <nomeProduto>Produto C</nomeProduto>     <!-- cbProduto.getSelectedItem(); -->
      <numControle>41666</numControle>    <!-- tfNumControle: getText(); -->
      <quantidade>4</quantidade>    <!-- tfQuantidade: getText(); -->
      <valorUnitario>41.46</valorUnitario>    <!-- tfValorUnitario: getText(); -->
      <codCliente>6</codCliente>     <!-- cbCodCliente.getSelectedItem(); -->
   </pedido>
</Pedido>

<!-- As tags comentadas são os valores a serem recuperados -->

I tried to do so:

Daomanager:

public interface DAOManager {
    
    ClienteDAO getClienteDAO();
    
    PedidoDAO getPedidoDAO();
    
    ProdutoDAO getProdutoDAO();
}

Request:

@XmlRootElement(name = "pedido")
@XmlAccessorType(XmlAccessType.FIELD)
@Entity
@Table(name = "pedido")
public class Pedido implements Serializable {
    
    @XmlElement(name="id")
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @XmlElement(name="dataCadastro")
    @Column
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataCadastro;

    @XmlElement(name="nomeProduto")
    @Column
    private String nomeProduto;

    @XmlElement(name="numControle")
    @Column
    private int numControle;

    @XmlElement(name="quantidade")
    @Column
    private int quantidade;

    @XmlElement(name="valorUnitario")
    @Column(precision=15, scale=7)
    private float valorUnitario;

    @XmlElement(name="codCliente")
    @Column
    private Integer codCliente;

    @XmlElement(name="valorTotal")
    @Column(precision=15, scale=7)
    private float valorTotal;

    @XmlElement(name="total")
    @Column(precision=2, scale=2)
    private Double total;

    
    public Pedido() {
    }
    
    
    public Pedido(int numControle, Date dataCadastro, String nomeProduto, float valorUnitario, float valorTotal, int quantidade, int codCliente, Double total){
        this.numControle = numControle;
        this.dataCadastro = dataCadastro;
        this.nomeProduto = nomeProduto;
        this.valorUnitario = valorUnitario;
        this.valorTotal = valorTotal;
        this.quantidade = quantidade;
        this.codCliente = codCliente;
        this.total = total;
    }

    /* Getters e setters del la aplicación */
         
    
}

Mysqlpedidodao:

/**
 *
 * @author Vickz
 */
public class MySQLPedidoDAO implements PedidoDAO {

    //null pointer exception pois esse campo estava inicializado como null antes
    public ConnectionFactory cf;

    
    public MySQLPedidoDAO(ConnectionFactory cf) {
        this.cf = cf;
    }

    
    @Override
    public void inserir(Pedido o) {
        cf.createEm().getTransaction().begin();
        //tanto persist quanto merge salvam o objeto no banco de dados 
        //em.persist(cliente);
        cf.createEm().merge(o);
        cf.createEm().getTransaction().commit();
        cf.close();
    }

    @Override
    public void alterar(Pedido o) {
        cf.createEm().getTransaction().begin();
        Pedido pedido = new Pedido();
        pedido.getId();
        cf.createEm().merge(o);
        cf.createEm().getTransaction().commit();
        cf.close();
    }

    @Override
    public void excluir(Pedido o) {
        cf.createEm().getTransaction().begin();
        cf.createEm().remove(o);
        cf.createEm().getTransaction().commit();
        cf.close();
    }

    @Override
    public Pedido pesquisar(Long id) {
        cf.createEm().getTransaction().begin();
        //erro abaixo
        Pedido pedido = cf.createEm().find(Pedido.class, id);
        cf.createEm().getTransaction().commit();
        //erro ao deletar pois o factory já está fechado
        //emf.close();
        return pedido;
    }
    
    @Override
    public List<Pedido> listar() {
        cf = new ConnectionFactory();
        cf.createEm().getTransaction().begin();
        //pedido = *, Pedido = nome da tabela
        Query consulta = cf.createEm().createQuery("select pedido from Pedido pedido");
        List<Pedido> pedidos = consulta.getResultList();
        cf.createEm().getTransaction().commit();
        cf.close();
        return pedidos;
    }

    
}

Viewpedidos:

public class ViewPedidos extends javax.swing.JInternalFrame {

    private DAOManager manager;
    private PedidoModel model;
    private MySQLPedidoDAO mspdao;
    private MySQLClienteDAO mscdao;
    private MySQLProdutoDAO msprdao;
    private List<Produto> produtos;
    private List<Pedido> pedidos;
    private Pedido ped;
    private Produto pro;
    private FiltroArquivo filter;
    private String xmlFile = "";
    private boolean editavel;
    private JAXBContext context;
 
    /* ....  Getters e Setters .... */

    private void btImportarActionPerformed(java.awt.event.ActionEvent evt) {                                           
        try {
            habilitarTextFieldEBotoes();
            JAXBContext context = JAXBContext.newInstance(ImportarPedidoList.class);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            Pedido pedido = (Pedido) unmarshaller.unmarshal(new File(xmlFile));
            // Como fazer isso?!
            
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, "Não foi possível importar o arquivo.xml", "Falha ao carregar", JOptionPane.INFORMATION_MESSAGE);
        }
    }                                          


    private void btProcurarActionPerformed(java.awt.event.ActionEvent evt) {                                           
        try {
            JFileChooser jFileChooser = new JFileChooser("C:\\Users\\Vickz\\Documents\\NetBeansProjects\\Loja");
            jFileChooser.setDialogTitle("Escolha o arquivo xml");
            jFileChooser.setFileFilter(new FiltroArquivo(".xml", "Arquivo XML"));
            int result = jFileChooser.showSaveDialog(this);
            if(result == JFileChooser.APPROVE_OPTION){
                //JOptionPane.showMessageDialog(this, jFileChooser.getName());
                xmlFile = jFileChooser.getSelectedFile().getAbsolutePath();
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, "Não foi possível carregar o arquivo.xml", "Falha ao carregar", JOptionPane.INFORMATION_MESSAGE);
        }
    }                                          

                 
/*
    @Override
    public void itemStateChanged(ItemEvent ie) {

        if (ie.getStateChange() == ItemEvent.SELECTED) {
          String value = ie.getItem().toString();
          // faz algo conforme a opção selecionada
          if (value.equals("Produto A")) {

          } else if (value.equals("Produto B")) {
          
          } else if (value.equals("Produto C")) {
              
          } else if (value.equals("Produto D")) {
              
          } else if (value.equals("Produto E")) {
              
          } else if (value.equals("Produto F")) {
              
          } else if (value.equals("Produto G")) {
              
          } else if (value.equals("Produto H")) {
               
          } else if (value.equals("Produto I")) {
                            
          }
       }
    }*/

}

I tried several ways to do it on main but it’s also not working

public class Main {

    private static JAXBContext context;
    
    
    
    public static void main(String[] args) throws JAXBException {
        ConnectionFactory cf = new ConnectionFactory();
    MySQLPedidoDAO mspdao = new MySQLPedidoDAO(cf);
    PedidoList pl = new PedidoList();
    

    Main.context = JAXBContext.newInstance(Pedido.class);
    //Marshaller marshaller = Main.context.createMarshaller();
    //marshaller.marshal(new Pedido(41666, new java.util.Date(2017, 3, 11), "Produto C", 41.46f, 0, 4, 6, 235.54), new File("pedido.xml"));
    Unmarshaller unmarshaller = Main.context.createUnmarshaller();
    Pedido pedidolist = (Pedido) unmarshaller.unmarshal(new File("C:\\Users\\Vickz\\Documents\\NetBeansProjects\\Loja\\pedido.xml"));
    
    Marshaller marshaller = Main.context.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    marshaller.marshal(pedidolist, System.out);
    
    
    /*for(PedidoList pedidolis: unmarshalledPedido.getPedidos()){
         System.out.println(pedido.getDataCadastro());
         System.out.println(pedido.getNomeProduto());
         System.out.println(pedido.getNumControle());
         System.out.println(pedido.getQuantidade());
         System.out.println(pedido.getValorUnitario());
         System.out.println(pedido.getCodCliente());
         System.out.println(pedido.getValorTotal());
         System.out.println(pedido.getTotal());
    }*/
}

Is there any easy way to solve this implementation with JAXB going through the file and splitting each of those fields and then manipulating them somewhere?

  • What you mean is that you are not able to fill the values in the attributes ?

  • That!! What I’m trying to do is read the whole file xml that I’m sending unmarshalling and what I want is to separate each of the tags and for example record each one in a pedido.setDataCadastro(), pedido.setNomeProduto por exemplo... I’m running the tests by class public static main void (string [] args) but what I want to do is that in the Viewpedidos class (Jswing Form) I can upload the file xml. Inside there I take each value separately from each tag and insert each one into a Jtextfield, Jcombobox... Hence the entries would be received in format xml

  • That is, when the user loads the file, the text fields receive the values of the file and the user only inserts without filling

No answers

Browser other questions tagged

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