J'ai l'entité suivante persisté pendant h2 dans un projet de printemps de JPA
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
}
J'ai une page HTML avec un formulaire pour entrer de nouvelles données comme celle-ci
<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>
C'est la méthode qui gère la publication depuis le contrôleur
@PostMapping("/product")
public String saveOrUpdateProduct(Product product){
productService.saveOrUpdate(product);
return "redirect:/product/"+product.getId();
}
Et c’est la méthode saveOrUpdate de la classe de service autowired qui gère l’interaction avec la base de données.
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;
}
Quand je vais à la page HTML avec le formulaire et j'essaie de soumettre, j'ai
Impossible de convertir la valeur de type 'Java.lang.String' en type requis 'Java.lang.Integer'; L'exception imbriquée est Java.lang.NumberFormatException: pour la chaîne d'entrée: "null"
Vous devez probablement annoter le produit param dans votre contrôleur:
@PostMapping("/product")
public String saveOrUpdateProduct(@RequestBody Product product)
Spring Javadoc pour @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.*/
J'espère que cela t'aides!
Le problème avait à faire avec
@PostMapping("/product")
public String saveOrUpdateProduct(Product product){
productService.saveOrUpdate(product);
return "redirect:/product/"+product.getId();
}
J'avais l'habitude d'appeler product.getId()
à partir du produit original non fusionné et il n'avait pas encore d'identifiant, je l'ai résolu en renvoyant un produit enregistré.
@PostMapping("/product")
public String saveOrUpdateProduct(Product product){
Product savedProduct = productService.saveOrUpdate(product);
return "redirect:/product/"+savedProduct.getId();
}