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.
[code]@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;
[/code]
Abaixo código da classe TipoVinho.
[code]@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;
[/code]
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
[quote=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[/quote]
Seria isso mas o Json ficou muito grande, eu resolvi criar uma nova classe que carregue toda essa informação, segue abaixo:
[code]@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;
[/code]
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.
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.
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