我有一个带有某些Spring Crud存储库的经典Spring Web应用程序。
我试图将我的实体保存在经典的角度形式内,并且随机出现此错误:
.w.s.m.s.DefaultHandlerExceptionResolver : Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: No _valueDeserializer assigned at [Source: java.io.PushbackInputStream@11936b0f; 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: java.io.PushbackInputStream@11936b0f; line: 1, column: 19] (through reference chain: com.adeo.volt.domain.HalfFlow["exchange"]->com.adeo.volt.domain.Exchange["id"])
这是我发送的杰森:
{ "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" } }
这是我的课程:
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 + '}'; } }
这是我的控制器签名:
@RequestMapping(method = RequestMethod.POST) public ResponseEntity<HalfFlow> save(@RequestBody HalfFlow halfflow){...}
我想知道什么会引发此错误,并且这种出现是随机的。
正如Alex所说,为防止无限递归,您添加了此批注
@JsonIgnoreProperties(value = {"exchange"}) @OneToMany(mappedBy = "exchange") private List<HalfFlow> halfFlows;
所以我实际上通过在注释中添加以下内容解决了这个问题
@JsonIgnoreProperties(value = {"exchange"}, allowSetters = true) @OneToMany(mappedBy = "exchange") private List<HalfFlow> halfFlows;
此解决方案在这里有更好的解释https://softwareengineering.stackexchange.com/questions/300115/best- way-to-deal-with-hibernate-1-many-relationship-over-rest-json- service