How to read the xml for object with XStream

1

I have a relationship from 1 to product n to historical, ie a product has several months / historical. How to read the following xml to Object?

<produto>
  <descricao>PAVESINO 800X15</descricao>
  <valor>2.30</valor>
  <historicos>
    <historico>
      <mesesHistoricos>2009-12-21 18:40:56.281 UTC</mesesHistoricos>
      <quantidade>6735</quantidade>
    </historico>
    <historico>
      <mesesHistoricos>2010-01-21 18:40:56.283 UTC</mesesHistoricos>
      <quantidade>5940</quantidade>
    </historico>
    <historico>
     <mesesHistoricos>2010-02-21 19:40:56.283 UTC</mesesHistoricos>
      <quantidade>4824</quantidade>
    </historico>
    <historico>
      <mesesHistoricos>2010-02-21 19:40:56.283 UTC</mesesHistoricos>
      <quantidade>7869</quantidade>
    </historico>
    <historico>
      <mesesHistoricos>2010-02-21 19:40:56.283 UTC</mesesHistoricos>
      <quantidade>8152</quantidade>
    </historico>
  </historicos>
</produto>

Follow the Product table:

@Entity

@Table (name="product") @NamedQueries ({@NamedQuery (name = Product.ALL, query="Select a FROM Product to"),         @NamedQuery (name = Product.COUNT, query="select count (a) from Product to"),         @NamedQuery (name = Product.DESCRICAO, query="from Product where upper (description) =: description")}) public class Product implements Serializable {

private static final long serialVersionUID = 1L;
public final static String ALL = "produto.populaproduto";
public final static String COUNT = "produto.countprodutoTotal";
public final static String DESCRICAO = "produto.descricao";

private Long codigo;

private Integer Version;

private String codigoProduto;

private String descricao;

private BigDecimal valor;

private List<Historico> historicos = new ArrayList<>();


@OneToMany(mappedBy = "produto", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
public List<Historico> getHistoricos() {
    return historicos;
}

public void setHistoricos(List<Historico> historicos) {
    this.historicos = historicos;
}

public Produto() {
}

public Produto(String descricao, BigDecimal valor) {
    this.descricao = descricao;
    this.valor = valor;
}

@Version
public Integer getVersion() {
    return Version;
}

public void setVersion(Integer version) {
    Version = version;
}

@Id
@GeneratedValue
public Long getCodigo() {
    return codigo;
}

public void setCodigo(Long codigo) {
    this.codigo = codigo;
}

@NotBlank
@Column(nullable = false, length = 50)
public String getCodigoProduto() {
    return codigoProduto;
}

public void setCodigoProduto(String codigoProduto) {
    this.codigoProduto = codigoProduto;
}

public void setDescricao(String descricao) {
    this.descricao = descricao == null ? null : descricao.toUpperCase().trim();

}

@NotBlank
@Column(nullable = false, length = 100)
public String getDescricao() {
    return descricao;
}

@Column(name = "valor", nullable = false, precision = 10, scale = 2)
public BigDecimal getValor() {
    return valor;
}

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

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((codigo == null) ? 0 : codigo.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Produto other = (Produto) obj;
    if (codigo == null) {
        if (other.codigo != null)
            return false;
    } else if (!codigo.equals(other.codigo))
        return false;
    return true;
}

}

Here is the History table:

@Entity

@Table (name="historical") @NamedQueries ({@NamedQuery (name = Historic.ALL, query="Select a FROM Historic a"),         @NamedQuery (name = Historico.COUNT, query="select count (a) from Historico to")}) public class Historical implements Serializable {

private static final long serialVersionUID = 1L;
public final static String ALL = "Historico.populaHistorico";
public final static String COUNT = "Historico.countHistoricoTotal";
public final static String DESCRICAO = "Historico.descricao";

private Long codigo;

private Integer Version;

private Date mesesHistoricos;

private Integer quantidade;

private Produto produto;

@Version
public Integer getVersion() {
    return Version;
}

public void setVersion(Integer version) {
    Version = version;
}

@Id
@GeneratedValue
public Long getCodigo() {
    return codigo;
}

public void setCodigo(Long codigo) {
    this.codigo = codigo;
}


@NotNull
@Temporal(TemporalType.DATE)
@Column(name = "meses_historicos", nullable = false)
public Date getMesesHistoricos() {
    return mesesHistoricos;
}

public void setMesesHistoricos(Date mesesHistoricos) {
    this.mesesHistoricos = mesesHistoricos;
}

@Column(nullable = false, length = 3)
public Integer getQuantidade() {
    return quantidade;
}

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

@ManyToOne
@JoinColumn(name = "id_produto", nullable = false)
public Produto getProduto() {
    return produto;
}

public void setProduto(Produto produto2) {
    this.produto = produto2;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((codigo == null) ? 0 : codigo.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Historico other = (Historico) obj;
    if (codigo == null) {
        if (other.codigo != null)
            return false;
    } else if (!codigo.equals(other.codigo))
        return false;
    return true;
}

}

    
asked by anonymous 03.05.2017 / 21:45

1 answer

1

You can convert XML to object Produto using XStream like this:

public Produto xmlToProduto(String xml) {
    XStream xstream = new XStream();
    xstream.alias("produto", Produto.class);
    xstream.alias("historico", Historico.class);
    return (Produto) xstream.fromXML(xml);
}

The alias command says to its xstream that the "product" attribute corresponds to the Product.class object and the "historical" attribute corresponds to the Historico.class object, with these parameters defined you only need to do the xml for Object with the command fromXML

You can find pretty cool content about XStream on the devmedia

    
03.05.2017 / 22:09