2017-03-15 3 views
0

Ich habe eine 'Order'-Klasse, die eine Liste von Objekten der Klasse' Triplet 'enthält. Wenn ich versuche, ein Auftragsobjekt im XML-Format zu bekommen, bekomme ich alle anderen Daten richtig, außer dies. Es folgt der Code-Schnipsel:Objekte in der Liste, die nicht in XML konvertiert werden

Order.java:

@XmlRootElement 
public class Order { 
    private String orderid; 
    private String orderStatus; 
    private String paidStatus; 
    private String address; 
    private double total; 
    private String emailid; 
    private String username; 
    private List<Triplet> movies=new ArrayList<>(); 
    public Order(String orderid, String orderStatus, String paidStatus,  String address, double total, String emailid, 
     String username) { 
    super(); 
    this.orderid = orderid; 
    this.orderStatus = orderStatus; 
    this.paidStatus = paidStatus; 
    this.address = address; 
    this.total = total; 
    this.emailid = emailid; 
    this.username = username; 
} 

public Order(String orderid, String orderStatus, String paidStatus, String address, double total, String emailid, 
     String username, List<Triplet> movies) { 
    super(); 
    this.orderid = orderid; 
    this.orderStatus = orderStatus; 
    this.paidStatus = paidStatus; 
    this.address = address; 
    this.total = total; 
    this.emailid = emailid; 
    this.username = username; 
    this.movies = movies; 
} 


    public Order() { 
    super(); 
} 
//getters and setters 
public String getOrderid() { 
    return orderid; 
} 
public void setOrderid(String orderid) { 
    this.orderid = orderid; 
} 
public String getOrderStatus() { 
    return orderStatus; 
} 
public void setOrderStatus(String orderStatus) { 
    this.orderStatus = orderStatus; 
} 
public String getPaidStatus() { 
    return paidStatus; 
} 
public void setPaidStatus(String paidStatus) { 
    this.paidStatus = paidStatus; 
} 
public String getAddress() { 
    return address; 
} 
public void setAddress(String address) { 
    this.address = address; 
} 
public double getTotal() { 
    return total; 
} 
public void setTotal(double total) { 
    this.total = total; 
} 
public String getEmailid() { 
    return emailid; 
} 
public void setEmailid(String emailid) { 
    this.emailid = emailid; 
} 
public String getUsername() { 
    return username; 
} 
public void setUsername(String username) { 
    this.username = username; 
} 
public List<Triplet> getMovies() { 
    return movies; 
} 
public void setMovies(List<Triplet> movies) { 
    this.movies = movies; 
} 
    public Order getObject(){ 
     Order o=new Order(); 
     o.setAddress("address1"); 
     o.setEmailid("email"); 
     o.setOrderid("orderid"); 
     o.setOrderStatus("in process"); 
     o.setPaidStatus("n"); 
     o.setTotal(250.5); 
     o.setUsername("admin"); 
     movies.add(new Triplet(1L,2,200.0)); 
     movies.add(new Triplet(2L,3,150.0)); 
     o.setMovies(movies); 
     return o; 
    } 
} 

Triplet.java:

@XmlRootElement 
public class Triplet implements Serializable { 

private long movieid; 
    private int quantity; 
    private double price; 



    public Triplet() { 
     super(); 
    } 

    public Triplet(long movieid, int quantity, double price) { 
     this.movieid = movieid; 
     this.quantity = quantity; 
     this.price = price; 
    } 

    public long getMovieid() { return movieid; } 
    public int getQuantity() { return quantity; } 
    public double getPrice() { return price; } 
} 

OrderResource.java:

@Path("/orders") 
public class OrderResource { 
OrderService os=new OrderService(); 

@GET 
@Produces(MediaType.APPLICATION_XML) 
@Path("/{emailid}") 
public Order getOrderByCustomer(@PathParam("emailid") String emailid){ 
    Order o=new Order(); 
    return o.getObject(); 
} 
} 

Ausgang:

<order> 
<address>address1</address> 
<emailid>email</emailid> 
<movies/> 
<movies/> 
<orderStatus>in process</orderStatus> 
<orderid>orderid</orderid> 
<paidStatus>n</paidStatus> 
<total>250.5</total> 
<username>admin</username> 
</order> 

Was kann getan werden, um in Filmen korrekte Werte zu erhalten?

bearbeiten

Das Problem war, dass die Liste des Objekts Triplet Klasse in Order-Objekt wurde nicht in XML umgewandelt zu werden.

Um dieses Problem zu lösen, funktioniert das Hinzufügen einer Anmerkung - @XmlAccessorType (XmlAccessType.FIELD) zur Triplet-Klasse wie im EDIT-Teil der Antwort von dsp_user erwähnt.

Antwort

0

Sie erhalten keine Werte in <Filme>, da die Order-Klasse keinen Getter für die Filmeigenschaft/Feld hat. Ändern Sie Ihre Order-Klasse um so etwas wie

@XmlRootElement 
public class Order { 
... 
@XmlElement 
private List<Triplet> movies; 

public List<Triplet> getMovies(){ 
    if(movies == null) 
    movies = new ArrayList<Triplet>(); 

    return movies; 
} 
.... 
    //The setter for movies isn't necessary because you can add new movies 
    //by calling getMovies().add(new Movie(1L,2,300.0)); 

} 

Ich habe nicht versucht, diese mit Ihren Daten, aber ich habe etwas ähnliches in der Vergangenheit getan, damit ich es wissen sollte funktionieren.

EDIT: Ich habe jetzt Ihren Code ausprobiert und es funktioniert, wenn Sie nur eine Anmerkung zur Triplet-Klasse hinzufügen.

@XmlAccessorType(XmlAccessType.FIELD) 
public class Triplet { 
... 
} 

ich mit diesem Code getestet (sowohl kommentiert und unkommentiert)

final String ORDER_XML = "C:\\test\\Order.xml"; 

    JAXBContext context = JAXBContext.newInstance(Order.class); 
    Marshaller m = context.createMarshaller(); 

    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 

    Order o = new Order(); 

    /* o.setAddress("address1"); 
    o.setEmailid("email"); 
    o.setOrderid("orderid"); 
    o.setOrderStatus("in process"); 
    o.setPaidStatus("n"); 
    o.setTotal(250.5); 
    o.setUsername("admin"); 

    o.getMovies().add(new Triplet(1L,2,200.0)); 
    o.getMovies().add(new Triplet(2L,3,150.0)); 
    o.getMovies().add(new Triplet(3L,3,400.0));*/ 
    //o.setMovies(movies); 
    m.marshal(o.getObject(), new File(ORDER_XML)); 

Die erzeugte XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<order> 
    <address>address1</address> 
    <emailid>email</emailid> 
    <movies> 
     <movieid>1</movieid> 
     <quantity>2</quantity> 
     <price>200.0</price> 
    </movies> 
    <movies> 
     <movieid>2</movieid> 
     <quantity>3</quantity> 
     <price>150.0</price> 
    </movies> 
    <orderStatus>in process</orderStatus> 
    <orderid>orderid</orderid> 
    <paidStatus>n</paidStatus> 
    <total>250.5</total> 
    <username>admin</username> 
</order> 
+0

Ich habe keine Getter Setter gezeigt, um es nicht sperrig zu machen. Dies ist nicht die ganze Klasse. Meine gesamte Bestellklasse ist: –

+0

Haben Sie meinen Vorschlag versucht? –

+0

Ich bearbeite meine Frage zum ursprünglichen Code. Ich habe bereits die Setter und Getter. –

0

Ändern Sie movies.add zu o.movies.add. Sie ändern die list von movies, die von this Referenz gehalten wird, während in getObject Methode Sie eine andere Instanz alle zusammen zurückgeben.

+0

versucht, dass noch gleiche Leistung. Und ich habe auch versucht, das zurückgegebene Objekt in der Konsole zu drucken, da bekomme ich alle Werte. Das Problem besteht darin, die Werte im XML-Format zu erhalten. –

Verwandte Themen