How to read xml for object with Xstream

Asked

Viewed 782 times

1

I have a relationship of 1 to n from product to historical , that is, a product has several months/histories. How to read the following xml for 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 a"), @Namedquery(name = Product.COUNT, query = "select Count(a) from Product a"), @Namedquery(name = Product.DESCRIPTION, 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;
}

}

Follow the table Historico :

@Entity

@Table(name = "historical") @Namedqueries({ @Namedquery(name = Historico.ALL, query = "Select a FROM Historico a"), @Namedquery(name = Historico.COUNT, query = "select Count(a) from Historico a") }) public class Historico Serializable Mplements {

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;
}

}

1 answer

1

Can you convert the XML for the object Produto using the XStream in this way:

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 command alias says to his xstream that the attribute "product" corresponds to the Product.class object and the attribute "historic" corresponds to the Historico.class object, with these parameters set just you need to convert the xml to Object with the command fromXML

You can find some really cool content about XStream in the devmedia

Browser other questions tagged

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