javaxmlparsingnetbeansarraylist

XML to ArrayList Java Rest Application


This is my first project with JEE/Rest applications

My problem is that I just can't get my server to parse an xml post to my object which contains an ArrayList...

Here is where I handle the @POST, the server just returns what it gets:

Search.java

@POST   
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Request returnRequest(Request input) { 
    return input;
}

When I post this:

<request>
    <name>Salle 101</name>
    <equipments>
        <equipment>
            <rfName>Tableau Blanc</rfName>
        </equipment>
        <equipment>
            <rfName>Video Projecteur</rfName>
        </equipment>
    </equipments>
    <startslot>9</startslot>
    <endslot>10</endslot>
    <size>6</size>
    <site>Toulouse</site>
</request>

I get this:

<?xml version="1.0" encoding="UTF-8"?>
<request>
   <endslot>10</endslot>
   <equipments/>
   <name>Salle 101</name>
   <site>Toulouse</site>
   <size>6</size>
   <startslot>9</startslot>
</request> 

As you can see I don't have my equipment list correctly returned...

Here are my entity files:

Request.java

@XmlRootElement(name = "request")
public class Request {
  //@XmlElement
  private String name;
  //@XmlElement
  private Equipments equipments;
  //@XmlElement
  private int startSlot;
  //@XmlElement
  private int endSlot;
  //@XmlElement
  private int size;
  //@XmlElement
  private String site;

  public Request(){
      // my stuff
  }

  // getters & setters

Equipment.java

@Entity
@Table(name = "equipment")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Equipment.findAll", query = "SELECT e FROM Equipment e"),
@NamedQuery(name = "Equipment.findByRfName", query = "SELECT e FROM Equipment e WHERE e.rfName = :rfName")})
public class Equipment implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 20)
    @Column(name = "RF_NAME")
    private String rfName;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "equipment")
    private Collection<RoomEquipment> roomEquipmentCollection;

    public Equipment() {
    }

    public Equipment(String rfName) {
       this.rfName = rfName;
    }

    //...

After a little bit of searching I saw that creating a class for the ArrayList could be useful, so here it is:

Equipments.java

@XmlRootElement(name="equipments")
public class Equipments implements Serializable {
    private ArrayList<Equipment> equipments;

    public Equipments(){ 
        this.equipments = new ArrayList<>();
    }

    public void add(Equipment eq){
        this.getEquipments().add(eq);
    }

    public ArrayList<Equipment> getEquipments(){
        return this.equipments;
    }

    /**
     * @param equipments the equipments to set
     */
    public void setEquipments(ArrayList<Equipment> equipments) {
        this.equipments = equipments;
    }

}

Thanks for your help


Solution

  • I finally found how do deal with it. It's just that I didn't really understood how @annotations were working...

    This website helped me to figure it out: http://blog.bdoughan.com/2010/09/jaxb-collection-properties.html