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