2016-04-11 2 views
0

Ich hatte dieses Problem vorher nicht, mit anderen POJOs, ich bin mir nicht sicher, was diesmal anders ist, aber ich kann nicht funktionieren und ich könnte finde keine genaue Lösung dafür.PUT-Anfrage mit JSON-Nutzdaten von Postman gesendet, verschachteltes Objekt nicht geparst

Ich habe diese POJO genannt Komponente (mit einigen Hibernate Annotations):

@Entity 
@Table(name="component", uniqueConstraints={@UniqueConstraint(
    columnNames = {"name", "component_type"})}) 
public class Component { 

@Column(name="id") 
@Id @GeneratedValue(strategy=GenerationType.AUTO) 
private int id; 

@Column(name="name") 
private String name; 

@Column(name="component_type") 
private String componentType; 

@Column(name="serial_number") 
private int serialNumber; 

@Column(name="active_since") 
private String activeSince; 

@Embedded 
private ComponentWearoutModel wearout; 

public Component() { 
} 

public Component(String name, String componentType, int serialNumber, String activeSince, 
     ComponentWearoutModel wearout) { 
    this.name = name; 
    this.componentType = componentType; 
    this.serialNumber = serialNumber; 
    this.activeSince = activeSince; 
    this.wearout = wearout; 
} 

public ComponentWearoutModel getModel() { 
    return wearout; 
} 

public void setModel(ComponentWearoutModel wearout) { 
    this.wearout = wearout; 
} 

//more getters and setters 

} 

ComponentWearoutModel:

@Embeddable 
public class ComponentWearoutModel { 

private String componentType; //dont mind the stupid duplicate attribute 
private Integer componentLifeExpectancy; 
private Float componentWearOutLevel; 
private Float actionThreshold; 

public ComponentWearoutModel() { 
} 

public ComponentWearoutModel(String componentType, int componentLifeExpectancy, float componentWearOutLevel, 
     float actionThreshold) { 
    this.componentType = componentType; 
    this.componentLifeExpectancy = componentLifeExpectancy; 
    this.componentWearOutLevel = componentWearOutLevel; 
    this.actionThreshold = actionThreshold; 
} 

//getters and setters 
} 

Die Probe Nutzlast Ich benutze:

{ 
"name": "component name", 
"componentType": "airfilter2", 
"serialNumber": 573224, 
"activeSince": "2016-04-10 17:38:41", 
"wearout": 
    { 
     "componentType": "airfilter", 
     "componentLifeExpectancy": 1000, 
     "componentWearOutLevel": 0.24, 
     "actionThreshold": 0.2 
    } 
} 

Und schließlich die Ressource Klasse:

@Path("myresource") 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.APPLICATION_JSON + ";charset=UTF-8") 
public class MyResource { 

DatabaseManager dm = DatabaseManager.getInstance(); 

@PUT 
@Path("Component") 
public Response storeComponent(Component component){ 
    System.out.println("reached"); 
    System.out.println(component.getComponentType()); //okay 
    System.out.println(component.getModel().getComponentType()); //nullpointerexception 
    ComponentWearoutModel model = new ComponentWearoutModel("type", 1000, 1f, 0.2f); 
    component.setModel(model); //this way it's saved in the db just fine 
    dm.save(component); 
    return Response.status(Status.OK).entity(component).build(); 
} 
} 

Ohne die Drucke werden nur die Felder in der Datenbanktabelle gespeichert, die nicht Teil der ComponentWearoutModel-Klasse sind, die anderen Spalten sind null. Wenn ich also versuche, einen von ihnen zu drucken, bekomme ich eine Ausnahme, ich verstehe einfach nicht warum. Wenn ich in der Ressourcenmethode ein ComponentWearoutModel erstelle und es der Komponente hinzufüge, ist in der Datenbank alles in Ordnung.

UPDATE:

so war mein Fehler, dass ich das ComponentWearoutModel Attribut als „wearout“ im Component.class, aber die automatisch generierte Getter und Setter genannt wurden getModel/setModel und moxy konnte nicht meine Nutzlast analysieren genannt aus diesem Grund. Lösung: Ändern Sie den Attributnamen in Component-Klasse und in Payload in "Modell".

+0

ich sehe kein Element-Modell es die Komponente Klasse. meinst du Verschleiß? – Sampada

+0

was meinst du genau? –

+0

Sie verwenden "component.setModel (model);" - Wo ist die Funktion setModel()? – Sampada

Antwort

1

Stellen Sie sicher, dass die Attributnamen, die Sie im POJO verwenden, mit denen übereinstimmen, die in der JSON-Zeichenfolge gesendet werden.

Da es in Ihrem POJO keine jackson etc Annotationen gibt, die ihm die entsprechende json Mapping mitteilen, verwendet der zugrunde liegende Code direkt die in json string angegebenen Namen. Wenn Sie die Zeichenfolge "model" verwenden, sucht der Konvertercode in Ihrem POJO nach einer "setModel" -Methode.

Im obigen Beispiel nennen Sie entweder alles "Model" oder "Wearable".

Verwandte Themen