Json incompleto no wbservices com JavaEE+Hibernate+Rest

4 respostas
J

Bom pessoal estou criando um webServices utilizando JavaEE + Hibernate+Rest.
Abaixo estão minhas classes Vinho e uma das que há um relacionamento TipoVinho.
Um Tipo de Vinho pode ter vários Vinhos, e um Vinho só pode ser de um Tipo de Vinho.
Eu fiz os mapeamentos baseado no JAXB, não sei se estão corretos, mas só estou com um problema, quando
vou gerar o Json da minha Lista de Vinho com o código abaixo.

@GET
	@Produces({ MediaType.APPLICATION_JSON })
	public List<Vinho> getVinhos(){
		return vinhoRepository.findAll();
	}

Ele me gera o Json somente com os dados da Classe Vinho sem os ids dos relacionamentos.

{"vinho":[{{"IdVinho":"2","NomeVinho":"VinhoA","Imagem":"4.png","Safra":"1213123","Preco":"123123.0"}]}

Como é a minha primeira vez eu não sei ao certo como ele deveria trazer esse Json com as FK como por exemplo o Id do Tipo de Vinho.
Gostaria de uma luz rsrs. Obrigado.

Abaixo classe Vinho.

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@Entity
@Table(name="TBVinho")
public class Vinho implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	@Id
	@GeneratedValue
	private Long IdVinho;
	private String NomeVinho;
	private String Imagem;
	
	@MapsId
    @XmlTransient
	 @ManyToOne
	    @JoinColumn(name="IdProdutor")
	private Produtor Produtor;
	
	@MapsId
    @XmlTransient
	@ManyToOne(fetch=FetchType.EAGER)
		@JoinColumn(name="IdOrigem")	
	private Origem Origem;

	@MapsId
    @XmlTransient
	@ManyToOne(fetch=FetchType.EAGER)
		@JoinColumn(name="IdTipoUva")	
	private TipoUva TipoUva;
	
	@MapsId
    @XmlTransient
	@ManyToOne(fetch=FetchType.EAGER)
	 	@JoinColumn(name="IdTipoVinho")
	private TipoVinho TipoVinho;
	
	private int Safra;
	
	private Double Preco;
Abaixo código da classe TipoVinho.
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@Entity
@Table(name="TBTipoVinho")
public class TipoVinho implements Serializable{


	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	@Id
	@GeneratedValue
	private Long IdTipoVinho;
	private String TipoVinho;
	@XmlTransient
	@OneToMany(targetEntity = Vinho.class,
            cascade=CascadeType.ALL,fetch=FetchType.LAZY,mappedBy="TipoVinho")
	private List<Vinho> Vinho;

4 Respostas

Alexandre_Saudate

Não entendí muito bem, você gostaria de trafegar também o TipoVinho, é isso? Se for o caso, basta retirar a anotação @XmlTransient do campo, assim:

@MapsId  
@ManyToOne(fetch=FetchType.EAGER)  
@JoinColumn(name="IdTipoVinho")  
private TipoVinho TipoVinho;

[]'s

J
Alexandre Saudate:
Não entendí muito bem, você gostaria de trafegar também o TipoVinho, é isso? Se for o caso, basta retirar a anotação @XmlTransient do campo, assim:
@MapsId  
@ManyToOne(fetch=FetchType.EAGER)  
@JoinColumn(name="IdTipoVinho")  
private TipoVinho TipoVinho;

[]'s

Seria isso mas o Json ficou muito grande, eu resolvi criar uma nova classe que carregue toda essa informação, segue abaixo:
@XmlRootElement
public class ListaVinho {
	
	private Long IdVinho;
	private String NomeVinho;
	private String Imagem;
	private Long IdProdutor;
	private Long IdOrigem;
	private Long IdTipoUva;
	private Long IdTipoVinho;
	private int  Safra;
	private Double Preco;

Depois no meu resource eu cria uma lista e preenche essa classe e envio via Json

@GET
	@Produces({ MediaType.APPLICATION_JSON })
	public List<ListaVinho> getVinhos(){
		return getAllVinhos();
	}

public List<ListaVinho> getAllVinhos(){
		
		List<Vinho> list = vinhoRepository.findAll();
		List<ListaVinho> createLista = new ArrayList<ListaVinho>();
		  for(Vinho v : list){
			  ListaVinho vinho = new ListaVinho();
			  	vinho.setIdVinho(v.getIdVinho());
			  	vinho.setNomeVinho(v.getNomeVinho());
			  	vinho.setIdProdutor(v.getProdutor().getIdProdutor());
			  	vinho.setIdOrigem(v.getOrigem().getIdOrigem());
			  	vinho.setIdTipoUva(v.getTipoUva().getIdTipoUva());
			  	vinho.setIdTipoVinho(v.getTipoVinho().getIdTipoVinho());
			  	vinho.setSafra(v.getSafra());
			  	vinho.setPreco(v.getPreco());
			  	vinho.setImagem(v.getImagem());
			  	createLista.add(vinho);
		  }
	   return createLista;
	}

Que o Json fica mais fácil de enviar:
{"listaVinho":[{"idOrigem":"1","idProdutor":"22","idTipoUva":"1","idTipoVinho":"1","idVinho":"1","nomeVinho":"teste","preco":"20.0","safra":"2000"}

Obrigado pela a resposta.

J

Não querendo abusar da sua boa vontade mas dando uma pesquisa vi um post que você respondeu de como enviar uma imagem usando o seguinte código:

@GET
	@Produces("image/png")
	public byte[] produces() throws IOException {
		File file = new File("D:\\imagem.png");
		FileInputStream fis = new FileInputStream(file);
		byte[] data = new byte[fis.available()];
		fis.read(data);
		return data;
	}

Como eu poderia recuperar essa imagem do outro lado que no meu caso é em um app. Android.
Você sabe como eu poderia fazer.
Desde já obrigado.

Alexandre_Saudate

Bom… não sei dizer, porque não conheço nada de Android. No Java comum, você faz como uma consulta qualquer. No final, é só fazer o parse para byte[].

[]'s

Criado 14 de março de 2013
Ultima resposta 15 de mar. de 2013
Respostas 4
Participantes 2