it-roy-ru.com

Не удалось преобразовать значение типа "Java.lang.String" в требуемый тип "Java.lang.Integer" в jpa spring

У меня следующая сущность сохранилась до h2 в весеннем проекте 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
}

У меня есть HTML-страница с формой для ввода новых данных, как это

<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>

Это метод обработки сообщения от контроллера 

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

И это метод saveOrUpdate в классе обслуживания с автопроводкой, который обрабатывает взаимодействие с базой данных.

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;
}

Когда я перехожу на страницу HTML с формой и пытаюсь отправить, у меня есть 

Не удалось преобразовать значение типа «Java.lang.String» в требуемый тип «Java.lang.Integer»; вложенное исключение - Java.lang.NumberFormatException: для входной строки: "null"

2
MrSir

Вероятно, вы должны аннотировать продукт param в вашем контроллере:

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

Spring Javadoc для @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.*/

Надеюсь это поможет!

1
Ele

Проблема была связана с 

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

Раньше я звонил product.getId() из оригинального не объединенного продукта, и у него еще не было идентификатора, я решил, что возвращаю сохраненный продукт 

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