此IllegalArgumentException的可能原因是什么?

时间:2019-03-27 14:27:23

标签: java spring illegalargumentexception type-mismatch

我正在尝试通过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;

以下是用于PUT方法的ProductController代码:

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

}

这是我通过邮递员进行PUT请求的网址:

  

http://localhost:8080/products/8

这是我要更新的数据库中的条目: entry

我收到的消息如下:

  

{       “ timestamp”:“ 2019-03-27T13:53:58.093 + 0000”,       “状态”:500,       “错误”:“内部服务器错误”,       “ message”:“为类testing.models.Product提供了错误类型的ID。预期:类java.lang.Integer,获得了类java.lang.String;嵌套异常是java.lang.IllegalArgumentException:提供了错误的ID类test.models.Product的类型。预期:类java.lang.Integer,得到类java.lang.String“,       “路径”:“ / products / 8”   }

  

org.hibernate.TypeMismatchException:为类testing.models.Product提供了错误类型的ID。预期:类java.lang.Integer,得到类java.lang.String

当我在各处将'id'声明为int时,我不明白如何提供String类型。如何解决?

2 个答案:

答案 0 :(得分:2)

请让我们看看// When _service is changed. _service.PropertyChanged += Service_PropertyChanged; 声明,我认为// Manually raise event to update list. private void Service_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { if (e.PropertyName == "MyList") OnPropertyChanged(nameof(ViewModelList)); } 方法是错误的,因为它的第一个参数为String,但是ProductRepository的Integer为@Id。

像下面一样更改findById

ProductRepository

答案 1 :(得分:2)

将您的存储库更改为CrudRepository<Product, Integer>,第二个参数必须是实体ID的类型。