2016-12-03 2 views
0

Ich benutze Federmvc mit Hibernate auf Mysql-Datenbank.
In einer der Tabellen befindet sich eine Spalte EndTime vom Typ Zeit, die Null sein könnte.Spring mvc Zeitspalte, die null empfängt Ursache HttpMessageNotReadableException

Ich habe es meiner Java-Klasse mit dem Typ java.sql.Time zugeordnet.

Erste Daten aus der Tabelle gut gehen, aber wenn ich versuche Zeilen mit leeren Wert in dieser speziellen Spalte hinzuzufügen, schlägt es mit dem folgenden Fehler:

... 
"exception": "org.springframework.http.converter.HttpMessageNotReadableException", 
"message": "Could not read JSON: Instantiation of [simple type, class java.sql.Time] value failed: null (through reference chain: mediamatrix.models.playlists.MediaAd[\"endTime\"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Instantiation of [simple type, class java.sql.Time] value failed: null (through reference chain: mediamatrix.models.playlists.MediaAd[\"endTime\"])", 
... 

Für diese Nutzlast von dem Client mit:

{"a":10100,"b":4667,...,"endTime":""} 

Wenn ich Wert der EndTime-Eigenschaft hinzufügen, wird es ohne ein Problem ausgeführt.

Weiß jemand, warum das passiert? Versucht, in den Setter-Methoden der Klasse auf Null zu prüfen, aber es ruft es nicht an, erzeugen Sie nur den Fehler.

Danke.

PS. Relevante Codeschnipsel:

Tabellenzuordnungsklasse: import org.hibernate.annotations.Type;

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.Table; 
import java.sql.Date; 
import java.sql.Time; 
import java.sql.Timestamp; 
import java.text.SimpleDateFormat; 

@Entity 
@Table(name = "atable") 
public class ATable { 

    @Column(name = "a") 
    int a; 

    @Id 
    @Column(name = "b") 
    int b; 

    ... 

    @Column(name = "EndTime") 
    Time EndTime; 

    ... 

    public Time getEndTime() { 
     return EndTime; 
    } 

    public void setEndTime(Time endTime) { 
//  if (endTime != null) { 
     EndTime = endTime; 
//  } 
    } 
} 

Controller:

@RequestMapping(value = "/addATableItem", method = RequestMethod.POST) 
public @ResponseBody Map<String, Object> AddATableItem(@RequestBody ATable aItem) { 
     return _session.addATableItem(aItem); 
} 

Hibernate Handhabung:

public Map<String, Object> addATableItem(ATable atable) { 
     Map<String, Object> res = new HashMap<>(); 
     try { 
      this.getSession().createSQLQuery("INSERT INTO atable (... EndTime) VALUES (... :EndTime)") 
        ... 
        .setParameter("EndTime", atable.getEndTime()).executeUpdate(); 
      res.put("status", 1); 
      res.put("message", "success"); 
     } catch (Exception e) { 
      res.put("status", 0); 
      res.put("message", "failure"); 
     } 
     return res; 
} 
+0

Spring weiß nicht, wie man java.sql.Time in einen JSon konvertiert. Sie können es selbst in einen String konvertieren oder stattdessen einen normalen java.util.Date verwenden. –

+0

@GuillaumeF. Ich habe versucht, Date-Objekt zu verwenden, aber es erkennt nicht das Zeitformat in der JSON (HH: mm: ss, z. B. 13:00:00). Dies ist die Fehlermeldung: "... kann keine Instanz von java.sql.Date aus String-Wert '13: 00: 00 'erstellen: keine gültige Darstellung ...". Auch das Objekt Zeit funktioniert, nur wenn das Feld Null ist, tritt das Problem auf. – Nadav96

Antwort

0

Gut fand ich, was das Problem war, beachten Sie, dass in der Nutzlast ich den endTime Wert gesendet wird, ist gleich einem leeren String anstatt null, als ich es auf null änderte, akzeptierte Frühling es!

Verwandte Themen