我在“SpringBootRestApi”应用程序中遇到@PostMapping问题。这是我遇到的唯一一个注解问题(@Get、@Put和@Delete工作正常)。我收到状态500(错误:内部服务器错误)。我做错了什么?
以下是我的@PostMapping:
@PostMapping
public Product insert(@RequestBody Product product) {
product.setProductId(null);
productRepo.save(product);
return product;
}
它位于我的REST API类“ProductApi”中
@RestController
@RequestMapping("/products")
public class ProductApi {
private ProductRepo productRepo;
public ProductApi(ProductRepo productRepo) {
this.productRepo = productRepo;
}
以防我也要粘贴我的存储库类
@Repository
public interface ProductRepo extends JpaRepository<Product, Integer> {
// Ignore these:
// List<Product> findByProductName(String name);
// List<Product> findByProductNameContainingIgnoringCase(String name);
// List<Product> findByProductNameContainingIgnoringCaseAndPriceBetween(String name, BigDecimal min, BigDecimal max);
// List<Product> findByPriceBetween(BigDecimal min, BigDecimal max);
}
我已经在PGadmin 4(PostgreSQL)中创建了我的数据库表。
有一个模型类叫做Product:
@Entity
@Table(name="products")
@NamedQuery(name="Product.findAll", query="SELECT p FROM Product p")
public class Product implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="product_id", insertable=false, updatable=false)
private Integer productId;
@Column(name="product_name")
private String productName;
private BigDecimal price;
private BigDecimal vat;
private String description;
public Product() {
}
// public Product(Integer productId, String productName, BigDecimal price, BigDecimal vat, String description) {
// this.productId = productId;
// this.productName = productName;
// this.price = price;
// this.vat = vat;
// this.description = description;
// }
public Integer getProductId() {
return this.productId;
}
public void setProductId(Integer productId) {
this.productId = productId;
}
public String getProductName() {
return this.productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public BigDecimal getPrice() {
return this.price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public BigDecimal getVat() {
return this.vat;
}
public void setVat(BigDecimal vat) {
this.vat = vat;
}
public String getDescription() {
return this.description;
}
public void setDescription(String description) {
this.description = description;
}
}
以下是日志的内容:
2023-02-12T11:16:27.581+01:00 WARN 29916 --- [nio-8081-exec-5] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 23502 2023-02-12T11:16:27.581+01:00 ERROR 29916 --- [nio-8081-exec-5] o.h.engine.jdbc.spi.SqlExceptionHelper : ERROR: null value in column "product_id" of relation "products" violates not-null constraint
Details: Failing row contains (null, XDDD, 69.69, 0.23, XDXDXD).
2023-02-12T11:16:27.583+01:00 ERROR 29916 --- [nio-8081-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [product_id" of relation "products]] with root cause
org.postgresql.util.PSQLException: ERROR: null value in column "product_id" of relation "products" violates not-null constraint
Details: Failing row contains (null, XDDD, 69.69, 0.23, XDXDXD).
甚至当我把这个放在评论中(在我的@PostMapping)://product.setProductId(null);
我仍然收到相同的错误。
我想当我@Post一些东西时,我不需要输入{id} --这是无用的。我或其他人如何需要知道下一条记录需要什么“productId”?这应该递增。
2条答案
按热度按时间jgwigjjp1#
org.postgresql.util.PSQLException:错误:关系"products"的列"product_id"中的空值违反了非空约束
错误消息表明"products"表中的"product_id"列不能包含空值,但您正试图为该列插入空值。
请尝试传递有效值,不能为null。
oogrdqng2#
我可以在你的代码中看到你手动将productId设置为null。因为你使用的是自动生成策略,所以请不要手动将产品Id设置为null。所以请删除该行产品。setProductId(null)。这里是我的github中的一个示例项目,它可能会帮助你正确地处理crud。我的git hub帐户中有很多CRUD操作的示例。https://github.com/alimjz/product-REST