web-dev-qa-db-fra.com

Impossible de convertir la valeur de type 'Java.lang.String' en type requis 'Java.lang.Integer' dans jpa spring

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"

2
MrSir

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!

1
Ele

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();
}
0
MrSir