Какова возможная причина этого IllegalArgumentException? - PullRequest
2 голосов
/ 27 марта 2019

Я пытаюсь обновить значение с помощью запроса PUT.Кажется, есть исключение IllegalArgumentException / TypeMismatchException, которое я не могу понять, почему.

Вот класс модели Product :

@Table(name="product")
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    private String name;
    private int price;
    private String vendor;
    private String description;
    private Boolean returnPolicy;

Вот код ProductController для метода PUT:

@Autowired
private ProductService productService;

@RequestMapping(method = RequestMethod.PUT, value = "/products/{id}")
public void updateProduct(@RequestBody Product product, @PathVariable int id) {
    res = productService.updateProduct(product, id);
    System.out.println(res ? "Successful" : "Unsuccessful");
}

Вот метод updateProduct для обновления продукта:

public Boolean updateProduct(Product product, int id) {
    if(productRepository.findById(Integer.toString(id)) != null) {
        productRepository.save(product);
        return true;
    }
        return false;
}

Вот мой класс ProductRepository:

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import testing.poc.models.Product;

@Repository
public interface ProductRepository extends CrudRepository<Product, String>{

}

Это URL для моего запроса PUT через Почтальона:

http://localhost:8080/products/8

Это запись в БД, которую я пытаюсь обновить: entry

Сообщение, которое я получаю, выглядит следующим образом:

{"отметка времени": "2019-03-27T13: 53: 58.093 + 0000", "статус": 500, "ошибка": "Внутренняя ошибка сервера", "сообщение": "Указан идентификаторневерный тип для класса testing.models.Product. Ожидается: класс java.lang.Integer, получен класс java.lang.String; вложенное исключение - java.lang.IllegalArgumentException: указан идентификатор неверного типа fили класс тестирования. модели. Продукт.Ожидаемый: класс java.lang.Integer, получил класс java.lang.String "," path ":" / products / 8 "}

и

org.hibernate.TypeMismatchException: предоставлен идентификатор неправильного типа для класса testing.models.Product. Ожидаемый: класс java.lang.Integer, получил класс java.lang.String

Я не понимаю, какСтроковый тип предоставляется, когда я везде объявил id как int. Как это можно исправить?

Ответы [ 2 ]

2 голосов
/ 27 марта 2019

Измените свой репозиторий на CrudRepository<Product, Integer>, вторым параметром должен быть тип идентификатора сущности.

2 голосов
/ 27 марта 2019

Пожалуйста, давайте посмотрим объявление ProductRepository, я предполагаю, что findById метод неправильный, поскольку он имеет String в качестве первого параметра, но ProductRepository имеет Integer как @ Id.

Изменить ProductRepository как показано ниже

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import testing.poc.models.Product;

@Repository
public interface ProductRepository extends CrudRepository<Product, Integer>{

}
...