为什么我在我的控制器中收到来自邮递员请求的空值?
Why am I receiving null from postman request in my controller?
我写了一个rest controller,它接收请求并将数据保存在db中。
这是我尝试使用 postman.
发送的 post 请求
{
"product_id" : "testproduct",
"default_concurrent":10,
"default_connections":1000,
"msan":10
}
我的实体 class :
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.NotBlank;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@Entity
@Table(name="products")
@EntityListeners(AuditingEntityListener.class)
public class Product {
@Id
@Column(name="product_id", nullable = false)
private String product_id;
@Column(name="default_concurrent", nullable = true)
private int default_concurrent;
@Column(name="default_connections", nullable = true)
private int default_connections;
@Column(name="msan", nullable = true)
private int msan;
public String getProduct() {
return product_id;
}
public void setProduct(String product) {
this.product_id = product;
}
public int getDefault_concurrent() {
return default_concurrent;
}
public void setDefault_concurrent(int default_concurrent) {
this.default_concurrent = default_concurrent;
}
public int getDefault_connections() {
return default_connections;
}
public void setDefault_connections(int default_connections) {
this.default_connections = default_connections;
}
public int getMsan() {
return msan;
}
public void setMsan(int msan) {
this.msan = msan;
}
}
我的控制器:
@PostMapping("/add")
public Product addProduct(@Valid @RequestBody Product product)
{
return productDao.saveProduct(product);
}
错误:
ids for this class must be manually assigned before calling save()
nested exception is org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): com.test.model.Product",
我在 SO 上经历了很多与此错误相关的 posts,其中大多数建议使用
@GeneratedValue(strategy=GenerationType.AUTO) or
@GeneratedValue(strategy=GenerationType.IDENTITY)
但我不能使用它,因为我的主键将是字符串,我不能将它更改为 Long。
调试时我可以看到在请求正文中我收到的 product_id 为空。其余属性具有正确的值。
但是如果我在数据库中再创建一个列作为 'Id' 并相应地更新实体 class 使 'Id' 作为主键并尝试执行那么我得到正确的请求正文中的值,它也被保存在数据库中。
需要帮助。
Because we treat the underscore character as a reserved character, we
strongly advise following standard Java naming conventions (that is,
not using underscores in property names but using camel case instead).
下划线_是保留字符 在 Spring 数据查询推导中可能允许手动 属性 路径描述。
坚持使用 camel-case 作为成员变量名称的 Java 命名约定,一切都会按预期工作。
您在使用 JPA 功能时也会遇到问题。所以我建议更改命名约定。
更改
private String product_id;
private int default_concurrent;
private int default_connections;
private int msan;
给,
private String productId;
private int defaultConcurrent;
private int defaultConnections;
private int msan;
更新1
为什么只有 product_id
为空
发现我在 IDE 中粘贴了相同的代码,发现 Entity Product 缺少字段 product_id[=43 的 getter-setter =].添加后,相同的代码将值保存到数据库中。但我仍然建议大家避免在字段的names中使用_,以避免进一步的问题,并遵循文档中的命名约定。在使用 JPA 时,例如 findBy(something with _ in name in an entity) 你可能会遇到类似于
的问题
我写了一个rest controller,它接收请求并将数据保存在db中。 这是我尝试使用 postman.
发送的 post 请求{
"product_id" : "testproduct",
"default_concurrent":10,
"default_connections":1000,
"msan":10
}
我的实体 class :
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.NotBlank;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@Entity
@Table(name="products")
@EntityListeners(AuditingEntityListener.class)
public class Product {
@Id
@Column(name="product_id", nullable = false)
private String product_id;
@Column(name="default_concurrent", nullable = true)
private int default_concurrent;
@Column(name="default_connections", nullable = true)
private int default_connections;
@Column(name="msan", nullable = true)
private int msan;
public String getProduct() {
return product_id;
}
public void setProduct(String product) {
this.product_id = product;
}
public int getDefault_concurrent() {
return default_concurrent;
}
public void setDefault_concurrent(int default_concurrent) {
this.default_concurrent = default_concurrent;
}
public int getDefault_connections() {
return default_connections;
}
public void setDefault_connections(int default_connections) {
this.default_connections = default_connections;
}
public int getMsan() {
return msan;
}
public void setMsan(int msan) {
this.msan = msan;
}
}
我的控制器:
@PostMapping("/add")
public Product addProduct(@Valid @RequestBody Product product)
{
return productDao.saveProduct(product);
}
错误:
ids for this class must be manually assigned before calling save()
nested exception is org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): com.test.model.Product",
我在 SO 上经历了很多与此错误相关的 posts,其中大多数建议使用
@GeneratedValue(strategy=GenerationType.AUTO) or @GeneratedValue(strategy=GenerationType.IDENTITY)
但我不能使用它,因为我的主键将是字符串,我不能将它更改为 Long。
调试时我可以看到在请求正文中我收到的 product_id 为空。其余属性具有正确的值。
但是如果我在数据库中再创建一个列作为 'Id' 并相应地更新实体 class 使 'Id' 作为主键并尝试执行那么我得到正确的请求正文中的值,它也被保存在数据库中。
需要帮助。
Because we treat the underscore character as a reserved character, we strongly advise following standard Java naming conventions (that is, not using underscores in property names but using camel case instead).
下划线_是保留字符 在 Spring 数据查询推导中可能允许手动 属性 路径描述。
坚持使用 camel-case 作为成员变量名称的 Java 命名约定,一切都会按预期工作。
您在使用 JPA 功能时也会遇到问题。所以我建议更改命名约定。 更改
private String product_id;
private int default_concurrent;
private int default_connections;
private int msan;
给,
private String productId;
private int defaultConcurrent;
private int defaultConnections;
private int msan;
更新1
为什么只有 product_id
为空发现我在 IDE 中粘贴了相同的代码,发现 Entity Product 缺少字段 product_id[=43 的 getter-setter =].添加后,相同的代码将值保存到数据库中。但我仍然建议大家避免在字段的names中使用_,以避免进一步的问题,并遵循文档中的命名约定。在使用 JPA 时,例如 findBy(something with _ in name in an entity) 你可能会遇到类似于