2016-12-05 6 views
1

ich einen klassischen Feder Web-App mit einiger Feder crud Repository habe.JsonException Kein _valueDeserializer zugewiesen

Ich versuche, meine Einheiten innerhalb einer klassischen Winkelform zu speichern, und ich bin immer zufällig diesen Fehler:

.w.s.m.s.DefaultHandlerExceptionResolver : Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: No _valueDeserializer assigned 
at [Source: [email protected]; line: 1, column: 19] (through reference chain: com.adeo.volt.domain.HalfFlow["exchange"]->com.adeo.volt.domain.Exchange["id"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: No _valueDeserializer assigned 
at [Source: [email protected]; line: 1, column: 19] (through reference chain: com.adeo.volt.domain.HalfFlow["exchange"]->com.adeo.volt.domain.Exchange["id"]) 

Hier ist meine sended Json:

{ 
    "exchange": { 
     "id": 305, 
     "processExchange": [], 
     "number": 305, 
     "halfFlows": [], 
     "name": "TEST2", 
     "type": { 
      "id": 2, 
      "name": "real-time" 
     }, 
     "technology": { 
      "id": 1, 
      "name": "ESB webMethods" 
     }, 
     "exchangesObjectsExchanges": [{ 
      "id": 235, 
      "exchangeObject": { 
       "id": 180, 
       "name": "TESTALEXX", 
       "objectMeaning": "t", 
       "internalReferent": "t", 
       "internalBusinessReferent": null, 
       "status": { 
        "id": 1, 
        "name": "Study In Progress" 
       }, 
       "type": { 
        "id": 1, 
        "name": "Canonical" 
       }, 
       "externalDocLink": null, 
       "keywords": null, 
       "qualityScore": null 
      } 
     }] 
    }, 
    "way": { 
     "id": 1, 
     "name": "TO" 
    }, 
    "halfFlowApplication": [{ 
     "application": { 
      "id": 2, 
      "name": "ADEXIOCRE2", 
      "type": { 
       "id": 1, 
       "name": "INTERNAL" 
      }, 
      "domain": { 
       "id": 6, 
       "name": "Logistics", 
       "letter": "L" 
      }, 
      "vendor": null, 
      "projectName": null, 
      "internalReferent": null, 
      "groupApplicationType": { 
       "id": 2, 
       "name": "MULTI INSTANCE" 
      }, 
      "halfFlowApplication": [{ 
       "id": 159 
      }] 
     } 
    }], 
    "halfFlowNumber": "L0305A", 
    "name": "TEST2_TO_ADEXIOCRE2", 
    "halfFlowBus": [{ 
     "bu": { 
      "id": 10, 
      "number": 10, 
      "shortLabel": "BCIT", 
      "longLabel": "BC ITALIE" 
     }, 
     "id": null 
    }], 
    "connector": { 
     "id": 4, 
     "name": "FTP" 
    } 
} 

Hier meine Klassen :

Exchange.java

@Entity 
public class Exchange { 

@Id 
@Column(unique = true, nullable = false) 
@GenericGenerator(name = "ExchangeGenerator", strategy = "increment") 
@GeneratedValue(generator = "ExchangeGenerator") 
private Long id; 

@Column(unique = true) 
private String name; 
private int number; 
private long technologyId; 
private long exchangeTypeId; 

@OneToMany(mappedBy = "exchange") 
private List<Halfflow> halfFlows; 

public Exchange() { 
} 

/* Getters and Setters */ 
public Long getId() { 
    return id; 
} 

public void setId(Long id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public int getNumber() { 
    return number; 
} 

public void setNumber(int number) { 
    this.number = number; 
} 

public long getTechnologyId() { 
    return technologyId; 
} 

public void setTechnologyId(long technologyId) { 
    this.technologyId = technologyId; 
} 

public long getExchangeTypeId() { 
    return exchangeTypeId; 
} 

public void setExchangeTypeId(Long exchangeTypeId) { 
    this.exchangeTypeId = exchangeTypeId; 
} 

public void setExchangeTypeId(long exchangeTypeId) { 
    this.exchangeTypeId = exchangeTypeId; 
} 

public List<Halfflow> getHalfFlows() { 
    return halfFlows; 
} 

public void setHalfFlows(List<Halfflow> halfFlows) { 
    this.halfFlows = halfFlows; 
} 

@Override 
public String toString() { 
    return "Exchange{" + 
      "id=" + id + 
      ", name='" + name + '\'' + 
      ", number=" + number + 
      ", technologyId=" + technologyId + 
      '}'; 
} 

} 

Halfflow.java

@Entity 
@Table(name="HALF_FLOW") 
public class HalfFlow { 

@Id 
@Column(name = "ID", unique = true, nullable = false) 
@GenericGenerator(name = "HalfflowGenerator", strategy = "increment") 
@GeneratedValue(generator = "HalfflowGenerator") 
@JsonProperty(value="id") 
private Long id; 

@Column(unique = true) 
@JsonProperty(value="halfFlowNumber") 
private String halfFlowNumber; 

@JsonProperty(value="name") 
private String name; 

@ManyToOne 
@JoinColumn(name = "WAY_ID") 
private Way way; 

@JsonProperty(value="externalDocLink") 
private String externalDocLink; 

@ManyToOne 
@JoinColumn(name = "HALF_FLOW_MODE_ID") 
@JsonProperty(value="mode") 
private HalfFlowMode mode; 

@JsonProperty(value="internalReferent") 
private String internalReferent; 

@JsonProperty(value="backupReferent") 
private String backupReferent; 

@ManyToOne 
@JoinColumn(name = "DATA_FORMAT_ID") 
@JsonProperty(value="format") 
private DataFormat format; 

@ManyToOne 
@JoinColumn(name = "CONNECTOR_ID") 
@JsonProperty(value="connector") 
private Connector connector; 

@ManyToOne 
@JoinColumn(name = "CONFIDENTIALITY_ID") 
@JsonProperty(value="confidentiality") 
private Confidentiality confidentiality; 

@ManyToOne 
@JoinColumn(name = "INTEGRITY_ID") 
@JsonProperty(value="integrity") 
private Integrity integrity; 

@ManyToOne 
@JoinColumn(name="HALF_FLOW_AVAILABILITY_ID") 
@JsonProperty(value="halfFlowAvailability") 
private HalfFlowAvailability halfFlowAvailability; 

@JsonIgnoreProperties(value = {"halfFlow"}) 
@OneToMany(mappedBy = "halfFlow") 
@JsonProperty(value="halfFlowApplication") 
private List<HalfFlowApplication> halfFlowApplication; 

@OneToMany(mappedBy = "halfFlow") 
@JsonProperty(value="halfFlowBus") 
private List<HalfFlowBu> halfFlowBus; 

@OneToMany(mappedBy = "halfFlow") 
@JsonProperty(value="serviceHalfFlow") 
private Set<ServiceHalfFlow> serviceHalfFlow; 

@JsonIgnoreProperties(value = {"halfFlows"}) 
@ManyToOne 
@JoinColumn(name="EXCHANGE_ID") 
@JsonProperty(value="exchange") 
private Exchange exchange; 

@JsonProperty(value="bridge") 
private boolean bridge; 

public HalfFlow() { 
} 

public HalfFlow(String halfFlowNumber, String name) { 
    this.halfFlowNumber = halfFlowNumber; 
    this.name = name; 
} 

public HalfFlow(Long id, String halfFlowNumber, String name) { 
    this.id = id; 
    this.halfFlowNumber = halfFlowNumber; 
    this.name = name; 
} 

@Override 
public boolean equals(Object o) { 
    if (this == o) return true; 
    if (o == null || getClass() != o.getClass()) return false; 

    HalfFlow halfFlow = (HalfFlow) o; 

    if (id != null ? !id.equals(halfFlow.id) : halfFlow.id != null) return false; 
    return name != null ? name.equals(halfFlow.name) : halfFlow.name == null; 

} 

@Override 
public int hashCode() { 
    int result = id != null ? id.hashCode() : 0; 
    result = 31 * result + (name != null ? name.hashCode() : 0); 
    return result; 
} 

public Long getId() { 
    return id; 
} 

public void setId(Long id) { 
    this.id = id; 
} 

public String getHalfFlowNumber() { 
    return halfFlowNumber; 
} 

public void setHalfFlowNumber(String halfFlowNumber) { 
    this.halfFlowNumber = halfFlowNumber; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public Way getWay() { 
    return way; 
} 

public void setWay(Way way) { 
    this.way = way; 
} 

public String getExternalDocLink() { 
    return externalDocLink; 
} 

public void setExternalDocLink(String externalDocLink) { 
    this.externalDocLink = externalDocLink; 
} 

public HalfFlowMode getMode() { 
    return mode; 
} 

public void setMode(HalfFlowMode mode) { 
    this.mode = mode; 
} 

public String getInternalReferent() { 
    return internalReferent; 
} 

public void setInternalReferent(String internalReferent) { 
    this.internalReferent = internalReferent; 
} 

public String getBackupReferent() { 
    return backupReferent; 
} 

public void setBackupReferent(String backupReferent) { 
    this.backupReferent = backupReferent; 
} 

public DataFormat getFormat() { 
    return format; 
} 

public void setFormat(DataFormat format) { 
    this.format = format; 
} 

public Connector getConnector() { 
    return connector; 
} 

public void setConnector(Connector connector) { 
    this.connector = connector; 
} 

public Confidentiality getConfidentiality() { 
    return confidentiality; 
} 

public void setConfidentiality(Confidentiality confidentiality) { 
    this.confidentiality = confidentiality; 
} 

public Integrity getIntegrity() { 
    return integrity; 
} 

public void setIntegrity(Integrity integrity) { 
    this.integrity = integrity; 
} 

public HalfFlowAvailability getHalfFlowAvailability() { 
    return halfFlowAvailability; 
} 

public void setHalfFlowAvailability(HalfFlowAvailability halfFlowAvailability) { 
    this.halfFlowAvailability = halfFlowAvailability; 
} 

public List<HalfFlowApplication> getHalfFlowApplication() { 
    return halfFlowApplication; 
} 

public void setHalfFlowApplication(List<HalfFlowApplication> halfFlowApplication) { 
    this.halfFlowApplication = halfFlowApplication; 
} 

public Exchange getExchange() { 
    return exchange; 
} 

public void setExchange(Exchange exchange) { 
    this.exchange = exchange; 
} 

public Set<ServiceHalfFlow> getServiceHalfFlow() { 
    return serviceHalfFlow; 
} 

public void setServiceHalfFlow(Set<ServiceHalfFlow> serviceHalfFlow) { 
    this.serviceHalfFlow = serviceHalfFlow; 
} 

public List<HalfFlowBu> getHalfFlowBus() { 
    if (halfFlowBus != null) 
     Collections.sort(halfFlowBus); 
    return halfFlowBus; 
} 

public void setHalfFlowBus(List<HalfFlowBu> halfFlowBus) { 
    this.halfFlowBus = halfFlowBus; 
} 

public boolean isBridge() { 
    return bridge; 
} 

public void setBridge(boolean bridge) { 
    this.bridge = bridge; 
} 

@Override 
public String toString() { 
    return "HalfFlow{" + 
      "id=" + id + 
      ", halfFlowNumber='" + halfFlowNumber + '\'' + 
      ", name='" + name + '\'' + 
      ", way=" + way + 
      ", externalDocLink='" + externalDocLink + '\'' + 
      ", mode=" + mode + 
      ", internalReferent='" + internalReferent + '\'' + 
      ", backupReferent='" + backupReferent + '\'' + 
      ", format=" + format + 
      ", connector=" + connector + 
      ", confidentiality=" + confidentiality + 
      ", integrity=" + integrity+ 
      ", halfFlowAvailability=" + halfFlowAvailability + 
      ", halfFlowApplication=" + halfFlowApplication + 
      ", halfFlowBus=" + halfFlowBus + 
      ", serviceHalfFlow=" + serviceHalfFlow + 
      (exchange != null ? ", exchange=" + exchange.getName() : "exchange=null")+ 
      ", bridge=" + bridge + 
      '}'; 
} 
} 

Hier ist meine Controller Unterschrift:

@RequestMapping(method = RequestMethod.POST) 
public ResponseEntity<HalfFlow> save(@RequestBody HalfFlow halfflow){...} 

Ich frage mich, was diesen Fehler werfen und diese Art von zufällig erscheinen ..

+0

erklärt können Sie die json senden, wenn dieser Fehler –

+0

kommt @TarunJain ich meinen Beitrag bearbeitet haben, um es hinzuzufügen – RVA

Antwort

2

denke ich, dieses Problem tritt nur auf, wenn Sie eine Exchange-Entität zum ersten Mal serialisieren. Vielleicht Jackson eine Kopie von Attributen für jedes Objekt speichern?

@JsonIgnoreProperties(value = {"exchange"}) 
@OneToMany(mappedBy = "exchange") 
private List<HalfFlow> halfFlows; 

Also, meine Vermutung ist Jackson "schwarze Liste" Eigenschaft Austausch von Halfflow bean:

Endlosschleife zu vermeiden, können Sie diese Anmerkung hinzugefügt.

Abhilfe: eine ObjectMapper Verwenden Sie für jede Einheit auf dem Controller:

ObjectMapper mapper = new ObjectMapper(); 

@RequestMapping(method = RequestMethod.POST) 
public ResponseEntity<HalfFlow> save(@RequestBody String json) throws JsonParseException, JsonMappingException, IOException { 
    HalfFlow node = mapper.readValue(json, HalfFlow.class); 
    HalfFlow halfflow = mapper.convertValue(node, HalfFlow.class); 
5

Als Alex sagte, die unendliche Rekursion zu verhindern, können Sie diese Anmerkung

@JsonIgnoreProperties(value = {"exchange"}) 
@OneToMany(mappedBy = "exchange") 
private List<HalfFlow> halfFlows; 

Also eigentlich gelöst habe ich dieses Problem durch die folgenden auf die Anmerkung

@JsonIgnoreProperties(value = {"exchange"}, allowSetters = true) 
@OneToMany(mappedBy = "exchange") 
private List<HalfFlow> halfFlows; 
Hinzufügen

Diese Lösung ist besser hier https://softwareengineering.stackexchange.com/questions/300115/best-way-to-deal-with-hibernate-1-many-relationship-over-rest-json-service

+0

Das ist für mich gearbeitet, thxs Mann – Ernest

Verwandte Themen