Web service com duas tabelas(primary key e foreign key)[RESOLVIDO]

Bom dia para todos! Pessoal tem um banco por exemplo duas tabela uma venda e a outra produto(Venda é com chave primaria e produto chave estrangeira) preciso colocar os dados de ambas no webservice em json, eu consigo colocar apenas uma tabela no caso de duas com informão ligada estou apanhando,rs. Essas duas tabelas momento estão ligada de um para muitos caso alguem poder me dar um exemplo ficarei muito grato.

você sabe dizer se o problema está no formato do json ou no código ?

No momento estou tentando em xml

Esse é o código do meu webservice que retorna apenas dados da venda

private Venda venda = new Venda(); // Classe venda
private Vendadao; // Responsavel de fazer a conexão e o codigo sql

@GET
    @Produces("application/xml; charset=UTF-8")
    @Path("venda/get")
    public Vendaxml getvenda() throws ClassNotFoundException, SQLException {

// Nova conexão e Statement
vendadao = new Vendadao();
// Consultando o cabeçalho da venda e colocando na classe
this.vendadao.consulvendaxml(vendaxml);
// retornando a classe já preenchida com os dados
 return vendaxml;
}

Voce pode repara que só tem apenas os dados da venda falta agregar o do produto e ai que não estou sabendo fazer, (Uma obsvação: Ja tentei com inner join e não tive sucesso)

O objeto venda contém o atributo Produto? Se sim verifique as anotações dele.

No banco de dados amigo Matheus estão ligada no chave primaria e estrangeira e a classe são separadas classe produto e classe venda, igual a tabela

Crie um atributo Produto no objeto Venda, e tente novamente. Se não estou enganado tem que por uma anotação a mais nesse atributo, estou pesquisando, pois não me lembro exatamente e já tem um tempo que não trabalho com ws.

Já tentei isso ao realizar o iner join para ajuntar os dados da venda e produto e coloca-los em uma unica classe onde tinha editado colocado todos atributos juntos me retorna nada, vazio no link do ws::disappointed:

Posta as classes ae seus pojos e as de acesso ao banco. Está usando algum framework para acesso ao banco como JPA? E qual IDE está utilizando?

E num posta essa carinha triste não. No meu antigo emprego me pediram pra consumir o WS da receita, e na época eu nem sabia o que era um WS e nenhum colega de equipe sabia como trabalhar com isso. Então peguei firme e pesquisei bastante, e em três desenvolvi um micro-service que utilizava praticamente todos os serviços que a receita disponibiliza. E estava integrando nossos sistemas com WS Restful.

net beans é o id assim que esta a classe venda

/*
 * 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 Cadastro;

import java.math.BigDecimal;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author ANDRE
 */
@XmlRootElement
public class Vendaxml {
    
    private int idempresa;
    private String datapedido, nomecli, telefone, cep, logradouro, numero, bairro, cidade, uf, nomeformapag;
    private BigDecimal idpedido, taxaentrega, total, valordinheiro;
    
    // Getter e Setter

    public int getIdempresa() {
        return idempresa;
    }

    public void setIdempresa(int idempresa) {
        this.idempresa = idempresa;
    }

    public String getDatapedido() {
        return datapedido;
    }

    public void setDatapedido(String datapedido) {
        this.datapedido = datapedido;
    }

    public String getNomecli() {
        return nomecli;
    }

    public void setNomecli(String nomecli) {
        this.nomecli = nomecli;
    }

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    public String getCep() {
        return cep;
    }

    public void setCep(String cep) {
        this.cep = cep;
    }

    public String getLogradouro() {
        return logradouro;
    }

    public void setLogradouro(String logradouro) {
        this.logradouro = logradouro;
    }

    public String getNumero() {
        return numero;
    }

    public void setNumero(String numero) {
        this.numero = numero;
    }

    public String getBairro() {
        return bairro;
    }

    public void setBairro(String bairro) {
        this.bairro = bairro;
    }

    public String getCidade() {
        return cidade;
    }

    public void setCidade(String cidade) {
        this.cidade = cidade;
    }

    public String getUf() {
        return uf;
    }

    public void setUf(String uf) {
        this.uf = uf;
    }

    public String getNomeformapag() {
        return nomeformapag;
    }

    public void setNomeformapag(String nomeformapag) {
        this.nomeformapag = nomeformapag;
    }

    public BigDecimal getIdpedido() {
        return idpedido;
    }

    public void setIdpedido(BigDecimal idpedido) {
        this.idpedido = idpedido;
    }

    public BigDecimal getTaxaentrega() {
        return taxaentrega;
    }

    public void setTaxaentrega(BigDecimal taxaentrega) {
        this.taxaentrega = taxaentrega;
    }

    public BigDecimal getTotal() {
        return total;
    }

    public void setTotal(BigDecimal total) {
        this.total = total;
    }

    public BigDecimal getValordinheiro() {
        return valordinheiro;
    }

    public void setValordinheiro(BigDecimal valordinheiro) {
        this.valordinheiro = valordinheiro;
    }
}

Classe produto

/*

  • 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 Cadastro;

import java.math.BigDecimal;
import javax.xml.bind.annotation.XmlRootElement;

/**
*

  • @author ANDRE
    */
    @XmlRootElement
    public class Produtoxml {

    private BigDecimal idpedidoprod, idpedido, valor = BigDecimal.ZERO, valortotal = BigDecimal.ZERO;
    private int idproduto;
    private String codproduto, nomeproduto, nometamanho, observacao;
    private double quantidade = 0;

    // Getter e Setter

    public BigDecimal getIdpedidoprod() {
    return idpedidoprod;
    }

    public void setIdpedidoprod(BigDecimal idpedidoprod) {
    this.idpedidoprod = idpedidoprod;
    }

    public BigDecimal getIdpedido() {
    return idpedido;
    }

    public void setIdpedido(BigDecimal idpedido) {
    this.idpedido = idpedido;
    }

    public BigDecimal getValor() {
    return valor;
    }

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

    public BigDecimal getValortotal() {
    return valortotal;
    }

    public void setValortotal(BigDecimal valortotal) {
    this.valortotal = valortotal;
    }

    public int getIdproduto() {
    return idproduto;
    }

    public void setIdproduto(int idproduto) {
    this.idproduto = idproduto;
    }

    public String getCodproduto() {
    return codproduto;
    }

    public void setCodproduto(String codproduto) {
    this.codproduto = codproduto;
    }

    public String getNomeproduto() {
    return nomeproduto;
    }

    public void setNomeproduto(String nomeproduto) {
    this.nomeproduto = nomeproduto;
    }

    public String getNometamanho() {
    return nometamanho;
    }

    public void setNometamanho(String nometamanho) {
    this.nometamanho = nometamanho;
    }

    public String getObservacao() {
    return observacao;
    }

    public void setObservacao(String observacao) {
    this.observacao = observacao;
    }

    public double getQuantidade() {
    return quantidade;
    }

    public void setQuantidade(double quantidade) {
    this.quantidade = quantidade;
    }
    }

O Meu webservice também e no Restfull e o banco estou usando postgre

E as classes de acesso aos dados do banco. As classes DAO

classe Dao da venda

package Dao;

import Cadastro.Vendaxml;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author ANDRÉ
 */
public class Vendadao extends Conexao {

    private Connection conexao;
    private Statement stmt;
    private ResultSet rs;
    private String sucesso;

    public Vendadao() throws ClassNotFoundException, SQLException {
        //iniciando conexao        
        this.conexao = getConnection();
        try {
            stmt = (Statement) conexao.createStatement();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
    // Consultando o pedido

    public List<Vendaxml> consulvendaxml(Vendaxml vendaxml) throws SQLException {
        List<Vendaxml> listar = new ArrayList<Vendaxml>();
        try {
            rs = stmt.executeQuery("select * from pedido order by idpedido");
            while (rs.next()) {
                vendaxml.setIdpedido(rs.getBigDecimal("idpedido"));
                vendaxml.setDatapedido(rs.getString("datapedido"));
                vendaxml.setNomecli(rs.getString("nomecli"));
                vendaxml.setTelefone(rs.getString("telefone"));
                vendaxml.setCep(rs.getString("cep"));
                vendaxml.setLogradouro(rs.getString("logradouro"));
                vendaxml.setNumero(rs.getString("numero"));
                vendaxml.setBairro(rs.getString("bairro"));
                vendaxml.setCidade(rs.getString("cidade"));
                vendaxml.setUf(rs.getString("uf"));
                vendaxml.setTaxaentrega(rs.getBigDecimal("taxaentrega"));
                vendaxml.setIdempresa(rs.getInt("idempresa"));
                vendaxml.setNomeformapag(rs.getString("nomeformapag"));
                vendaxml.setValordinheiro(rs.getBigDecimal("valordinheiro"));
                vendaxml.setTotal(rs.getBigDecimal("total"));

                listar.add(vendaxml);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            conexao.close();
            stmt.close();
        }
        return listar;
    }
}

classe Dao do produto

package Dao;

import Cadastro.Produtoxml;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
*

  • @author ANDRÉ
    */
    public class Produdao extends Conexao {
    public List consulprodutoxml(Produtoxml produtoxml) throws SQLException {
    List listar = new ArrayList();
    try {
    rs = stmt.executeQuery(“select * from produto where idpedido = 1 order by nomeproduto”);
    while (rs.next()) {
    produtoxml = new Pedidoprodxml();
    produtoxml.setIdpedidoprod(rs.getBigDecimal(“idpedidoprod”));
    produtoxml.setIdpedido(rs.getBigDecimal(“idpedido”));
    produtoxml.setIdproduto(rs.getInt(“idproduto”));
    produtoxml.setCodproduto(rs.getString(“codproduto”));
    produtoxml.setNomeproduto(rs.getString(“nomeproduto”));
    produtoxml.setNometamanho(rs.getString(“nometamanho”));
    produtoxml.setValor(rs.getBigDecimal(“valor”));
    produtoxml.setQuantidade(rs.getDouble(“quantidade”));
    produtoxml.setValortotal(rs.getBigDecimal(“valortotal”));
    produtoxml.setObservacao(rs.getString(“observacao”));

              listar.add(produtoxml);
          }
      } catch (SQLException e) {
          e.printStackTrace();
      } finally {
          conexao.close();
          stmt.close();
      }
      return listar;
    

    }
    }

Tenta fazer da seguinte maneira.

1° Na classe Venda, substitua o atributo idPedido(BigDecimal), para idProduto(Produto).

2° Anote o atributo private Produto idProduto, com a seguinte anotação. @XmlElement(name = “Produto”)

Obs: Tipo BigDecimal é mais usado comumente para tratar de valor monetários assim como o Double, lembrando que o BigDecimal é mais preciso.
Por se tratar de um ID que seria um número Inteiro, seria mais viável, pois diminuiria um consumo de memória, mesmo que pouca coisa.

3° Realize as duas consultas uma trazendo a venda e outra o produto. E sete o objeto Produto no Objeto Venda. Agora realize a chamada no WS e veja se funcionou.

eu tinha postado errado eu fiz uma pequena correção. O idpedido da venda e ligada com idpedido do produto(Chave primaria e Estrangeira)

vou fazer os teste, e volto para comunicar o que deu. Fico muito grato pela atenção amigo Matheus

Fiz as mundaças e deu Certo!!! Matheus muito obrigado pela ajuda amigo, analizando o que voce me passou eu estava consultando via Inner join tudo junto em uma unica classe, só que fiz duas consultas separadas como voce me falou e fiz um seter e geter nos produtos na classe de venda em forma de list ficando assim.

private List <'Produtoxml'> produtoxml;

public List<Produtoxml> getProdutoxml() {
    return produtoxml;
}

public void setProdutoxml(List<Produtoxml> produtoxml) {
    this.produtoxml = produtoxml;
}

Depois na classe webservice mudei o código deixando assim..

@GET
@Produces("application/xml; charset=UTF-8")
@Path("venda/get")
public Vendaxml getvenda() throws ClassNotFoundException, SQLException {

// Nova conexão e Statement
vendadao = new Vendadao();
// Consultando o cabeçalho da venda e colocando na classe
this.vendadao.consulvendaxml(vendaxml);
// Nova conexão e Statement
produtodao = new Produtodao();
// Consultando o produto
List<'Produto'> produtolist = produtodao.consulprodutoxml(produtoxml);
// Setando a listagem para produtoxml no formato de lista na classe venda
this.vendaxml.setProdutoxml(produtolist);
// retornando a classe já preenchida com os dados
return vendaxml;
}

Retornando 100 % :smile::pray: