title: JsonException No _valueDeserializer assigned
body: <p>I've a classic spring web app with some spring crud repository.</p>
  
  <p>I'm trying to save my entities within a classic angular form and i'm getting randomly this error : </p>
  
  <pre><code>.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"]-&gt;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"]-&gt;com.adeo.volt.domain.Exchange["id"])
  </code></pre>
  
  <p>Here is my sended Json :</p>
  
  <pre><code>{
      "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"
      }
  }
  </code></pre>
  
  <p>Here is my classes :</p>
  
  <p>Exchange.java</p>
  
  <pre><code>@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&lt;Halfflow&gt; 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&lt;Halfflow&gt; getHalfFlows() {
      return halfFlows;
  }
  
  public void setHalfFlows(List&lt;Halfflow&gt; halfFlows) {
      this.halfFlows = halfFlows;
  }
  
  @Override
  public String toString() {
      return "Exchange{" +
              "id=" + id +
              ", name='" + name + '\'' +
              ", number=" + number +
              ", technologyId=" + technologyId +
              '}';
  }
  
  }
  </code></pre>
  
  <p>Halfflow.java</p>
  
  <pre><code>@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&lt;HalfFlowApplication&gt; halfFlowApplication;
  
  @OneToMany(mappedBy = "halfFlow")
  @JsonProperty(value="halfFlowBus")
  private List&lt;HalfFlowBu&gt; halfFlowBus;
  
  @OneToMany(mappedBy = "halfFlow")
  @JsonProperty(value="serviceHalfFlow")
  private Set&lt;ServiceHalfFlow&gt; 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&lt;HalfFlowApplication&gt; getHalfFlowApplication() {
      return halfFlowApplication;
  }
  
  public void setHalfFlowApplication(List&lt;HalfFlowApplication&gt; halfFlowApplication) {
      this.halfFlowApplication = halfFlowApplication;
  }
  
  public Exchange getExchange() {
      return exchange;
  }
  
  public void setExchange(Exchange exchange) {
      this.exchange = exchange;
  }
  
  public Set&lt;ServiceHalfFlow&gt; getServiceHalfFlow() {
      return serviceHalfFlow;
  }
  
  public void setServiceHalfFlow(Set&lt;ServiceHalfFlow&gt; serviceHalfFlow) {
      this.serviceHalfFlow = serviceHalfFlow;
  }
  
  public List&lt;HalfFlowBu&gt; getHalfFlowBus() {
      if (halfFlowBus != null)
          Collections.sort(halfFlowBus);
      return halfFlowBus;
  }
  
  public void setHalfFlowBus(List&lt;HalfFlowBu&gt; 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 +
              '}';
  }
  }
  </code></pre>
  
  <p>Here is my controller signature :</p>
  
  <pre><code>@RequestMapping(method = RequestMethod.POST)
  public ResponseEntity&lt;HalfFlow&gt; save(@RequestBody HalfFlow halfflow){...}
  </code></pre>
  
  <p>I'm wondering what can throw this error and this appear kind of randomly..</p>