2016-04-02 15 views
1

Ich habe 3 Tabellen in meiner Datenbank - Booking, Restaurant und RestaurantTable. Im Moment versuche ich eine neue Buchung zu erstellen, und eine der nächsten Schritte ist das Hinzufügen einer Tabelle. Wenn ich versuche, diese Tabelle wird die folgenden Fehler hinzufügen aufkommt:Ein Nullwert kann keinem primitiven Fehlertyp zugeordnet werden (Spring/Hibernate)

org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type @javax.persistence.Column int for value 'null'; nested exception is java.lang.IllegalArgumentException: A null value cannot be assigned to a primitive type 

Ich weiß nicht, warum es diesen Fehler gibt, da die Tabelle I nicht null hinzufügen versuch ist (denke ich zumindest). Ich hoffe du verstehst was ich meine.

Meine Buchung Tabelle in der Datenbank:

CREATE TABLE `booking` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `R_id` int(11) NOT NULL, 
    `date` date not null, 
    `start` TEXT, 
    `duration` float(3,1), 
    `amount_of_people` int, 
    `name` TEXT, 
    `contact_preference` TEXT, 
    `phone_number` TEXT, 
    `comments` TEXT, 
    `current_datetime` datetime default current_timestamp, 
    `new_date` datetime default current_timestamp, 
    `deleted` bool default false, 
    `edited` bool default false, 
    `table_number` int, 
    PRIMARY KEY (`id`), 
    FOREIGN KEY (`R_id`) references `restaurant`(`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 
/*!40101 SET character_set_client = @saved_cs_client */; 

Mein RestaurantTable in der Datenbank:

CREATE TABLE `restaurant_table` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `table_size` int, 
    `table_number` int, 
    `restaurant_id` int(11), 
    PRIMARY KEY (`id`), 
    FOREIGN KEY (`restaurant_id`) references `restaurant`(`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 
/*!40101 SET character_set_client = @saved_cs_client */; 

Die .jsp Datei der Tabelle I auf die Buchung hinzufügen versuchen:

<body> 
<jsp:include page="../fragments/menu.jsp"/> 
<div id="body"> 
    <h2>Create new booking</h2> 

    <form:form method="POST" modelAttribute="booking" > 
     <table> 
      <tr> 
       <td>Choose a table*:</td> 
       <td><form:select path="tableNumber"> 
         <form:option value="" label="--- Select ---" /> 
         <form:options items="${tables}" itemValue="tableNumber" itemLabel="tableNumber"/> 
       </form:select> 
      </tr> 
      <tr> 
       <td colspan="3"><input type="submit" /></td> 
      </tr> 
     </table> 
    </form:form> 
    <div> 
     <a href="/bookings">Back to List</a> 
    </div> 
</div> 
<jsp:include page="../fragments/footer.jsp"/> 

</body> 

Relevante Methoden in BookingController.java:

@RequestMapping(value = "booking/create/{id}", method = RequestMethod.GET) 
public String chooseTable(@PathVariable Long id, Model model) { 
    Booking booking = bookingService.getBooking(id); 
    Restaurant restaurant = booking.getRestaurant(); 
    Set<RestaurantTable> tableSet = restaurant.getTable(); 
    model.addAttribute("tables", tableSet); 
    model.addAttribute("booking", booking); 
    return "chooseTable"; 
} 

@RequestMapping(value = "booking/create/{id}", method = RequestMethod.POST) 
public String chooseTableAction(@PathVariable Long id, Model model) { 
    return "redirect:/bookings"; 
} 

Gerade jetzt macht die POST-Methode in der Buchungssteuerung nichts, da es mir schon vorher einen Fehler gibt.

Jede Hilfe wird geschätzt!

Antwort

2

Sie müssen Felder als Objekttyp (Integer, Long ... usw.) anstelle des primitiven Typs (int, long ... usw.) in Ihrem Value-Objekt deklarieren.

Es gibt keine "Null" im primitiven Typ. Es scheint, dass Sie einen Nullwert auf ein primitives Feld in Ihrem Wertobjekt abbilden, sodass Spring es nicht für Sie konvertieren kann.

2

Das Problem mit Ihrem Code ist, dass Tabellennummer Feld in Booking.java vom Typ int ist, aber in Ihrem JSP haben Sie Folgendes.

<form:option value="" label="--- Select ---" /> 

Dies bedeutet im Wesentlichen, dass der Wert aus der Auswahl Dropdown in null sein kann, die Fall Frühling hat keine Möglichkeit, eine Null zu einem primitiven Typ konvertieren damit sie sich eine solche Ausnahme beim Laden der Seite wirft. Es gibt 2 mögliche Lösungen für dieses Problem:

1> Ändern Sie den Wert von value = "" in eine Zahl wie value = "- 1" für die leere Option und behandeln Sie die -1 in Ihrer Anwendungslogik entsprechend.

<form:option value="-1" label="--- Select ---" /> 

2> Andere Option ist das Feld tablenumber zu deklarieren vom Typ Integer sein statt int.

Verwandte Themen