2017-12-29 13 views
0

ich die folgende Einheit habe durch h2 in einem PPV Frühjahr Projekt beharrenIn JPA Feder erforderlich Typen ‚java.lang.Integer‘ konvertieren Werte vom Typ ‚java.lang.String‘ fehlgeschlagen

public class Product implements DomainObject{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 
    @Version 
    private Integer version; 
    private String description; 
    private BigDecimal price; 
    private String imageUrl; 

    public Product() { 
    } 
// getters and setters 
} 

I eine HTML-Seite mit einem Formular, um neue Daten wie diese

<form class="form-horizontal" th:object="${product}" 
      th:action="@{/product}" method="post"> 
     <input type="hidden" th:field="*{id}"/> 
     <div class="form-group"> 
      <label class="col-sm-2 control-label">Description:</label> 
      <div class="col-sm-10"> 
       <input type="text" class="form-control" th:field="*{description}"/> 
      </div> 
     </div> 
     <div class="form-group"> 
      <label class="col-sm-2 control-label">Price:</label> 
      <div class="col-sm-10"> 
       <input type="text" class="form-control" th:field="*{price}"/> 
      </div> 
     </div> 
     <div class="form-group"> 
      <label class="col-sm-2 control-label">Image Url:</label> 
      <div class="col-sm-10"> 
       <input type="text" class="form-control" th:field="*{imageUrl}"/> 
      </div> 
     </div> 
     <div class="row"> 
      <button type="submit" class="btn btn-default">Submit</button> 
     </div> 
    </form> 

zu betreten ist dies die Methode, die die Post von der Steuerung

@PostMapping("/product") 
public String saveOrUpdateProduct(Product product){ 
    productService.saveOrUpdate(product); 
    return "redirect:/product/"+product.getId(); 
} 
FAHRVERHALTEN

Und das ist die saveOrUpdate Methode in der autowired Service-Klasse, die Interaktion mit der Datenbank

private EntityManagerFactory emf; 

@PersistenceUnit 
public void setEmf(EntityManagerFactory emf) { 
    this.emf = emf; 
} 

@Override 
public Product saveOrUpdate(Product domainObject) { 
    EntityManager em = emf.createEntityManager(); 
    em.getTransaction().begin(); 
    Product savedProduct = em.merge(domainObject); 
    em.getTransaction().commit(); 
    return savedProduct; 
} 

Als ich mit dem Formular auf die HTML-Seite gehen Griffe und ich versuche ich einreichen

fehlgeschlagen um den Wert des Typs 'java.lang.String' in den erforderlichen Typ 'java.lang.Integer' zu konvertieren; verschachtelte Ausnahme ist java.lang.NumberFormatException: Für Eingabestring: "null"

+0

Sie sagten, dies ist für neue Daten, richtig? Wenn ja, warum hast du eine versteckte Eingabe für die ID? – Powerlord

+0

@Powerlord weil er speichern oder aktualisieren will – Ele

+0

Was genau für diesen Eingang gestellt bekommt: ''. Ich vermute, dass "id" null ist, wenn es vom Controller an Ihre Vorlage übergeben wird. – tsolakp

Antwort

0

Wahrscheinlich müssen Sie das param Produkt in Ihrem Controller mit Anmerkungen versehen:

@PostMapping("/product") 
public String saveOrUpdateProduct(@RequestBody Product product) 

Frühling Javadoc für @RequestBody

@Target(value=PARAMETER) 
@Retention(value=RUNTIME) 
@Documented 
public @interface RequestBody 

/*Annotation indicating a method parameter should be bound to the body of the 
    web request. The body of the request is passed through an 
    HttpMessageConverter to resolve the method argument depending on the 
    content type of the request.*/ 

hoffe, das hilft!

+0

Wenn ich hinzufügen, dass Anmerkung i diesen Fehler haben ** Es war ein unerwarteter Fehler (type = Nicht unterstützter Medientyp, status = 415). Inhaltstyp 'application/x-www-form-urlencoded; charset = UTF-8' nicht unterstützt ** – MrSir

+0

Versuchen Sie, die charset in Ihrer Form '

' – Ele

+0

ich habe den gleichen Fehler – MrSir

0

Das Problem mit

@PostMapping("/product") 
public String saveOrUpdateProduct(Product product){ 
    productService.saveOrUpdate(product); 
    return "redirect:/product/"+product.getId(); 
} 

ich product.getId() aus dem ursprünglichen nicht fusionierten Produkt zu nennen pflegte zu tun hatte, und es hat keine Id noch, ich löste es einen gespeicherte Artikel Rückkehr

@PostMapping("/product") 
public String saveOrUpdateProduct(Product product){ 
    Product savedProduct = productService.saveOrUpdate(product); 
    return "redirect:/product/"+savedProduct.getId(); 
} 
Verwandte Themen