【问题标题】:Why am I receiving null from postman request in my controller?为什么我在控制器中收到来自邮递员请求的空值?
【发布时间】:2019-11-23 21:13:57
【问题描述】:

我编写了一个接收请求并将数据保存在数据库中的休息控制器。 这是我尝试使用邮递员发送的发帖请求

{
    "product_id" : "testproduct",
    "default_concurrent":10,
    "default_connections":1000,
    "msan":10
}

我的实体类:

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上浏览了很多与此错误相关的帖子,其中大多数建议使用

@GeneratedValue(strategy=GenerationType.AUTO) 或 @GeneratedValue(strategy=GenerationType.IDENTITY)

但我不能使用它,因为我的主键将是字符串,我不能将其更改为 Long。

在调试时,我可以看到在请求正文中我收到的 product_id 为 null。其余属性的值正确。

但是,如果我在数据库中再创建一列作为“Id”并相应地更新实体类,使“Id”作为主键并尝试执行,那么我在请求正文中得到正确的值,并且它被保存在数据库也是如此。

需要帮助。

【问题讨论】:

  • if 应该是模型中的 getProduct_id 和 setProduct_id。但更好的是你应该在 java 中改为驼峰式
  • 如果变量名使用_,请尝试使用@JsonProperty

标签: java hibernate rest spring-boot jpa-2.0


【解决方案1】:

因为我们将下划线字符视为保留字符,所以我们 强烈建议遵循标准 Java 命名约定(即 不在属性名称中使用下划线,而是使用驼峰式大小写)。

Doc

下划线 _ 是 Spring Data 查询派生中的保留字符,可能允许手动属性路径描述.

坚持使用 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 只为 null

发现我在我的 IDE 中粘贴了相同的代码,发现 Entity Product 缺少字段 product_id 的 getter-setter。添加后,相同的代码将值保存到数据库中。但我仍然建议大家避免在该字段的名称中使用 _,以避免进一步的问题,并遵循文档中的命名约定。当使用 JPA 时,例如 findBy(something with _ in name in an entity),您可能会遇到类似于this 的问题

【讨论】:

  • 感谢 Patel Romil,我完全不知道这个事实!!
  • 还有一个疑问,我得到的只是 product_id 的空值,而不是 default_connections 和 default_concurrent 等其他字段,即使它们也有下划线?
  • 您好@NaveenYadav,我已将您的代码粘贴到 IDE 中,发现您的产品模型缺少 product_id 的 getter-setter。没有getter-setter,它会产生与上面相同的问题,但是在我添加它之后,我可以将它保存到数据库中
  • @NaveenYadav 但我仍然建议您避免在字段名称中使用 _,因为当您使用诸如 findBy(something) 之类的 JPA 时,您可能会遇到类似于 stackoverflow.com/questions/56961166/… 的问题
  • 好的,现在我得到了问题......最后我可以得出结论,下划线不是真正的罪魁祸首......它是必须是“setProduct_id”的setter方法@Jerry06 建议的“setProduct”,因为我想在内部它会寻找以前的类型设置器。谢谢!!!
猜你喜欢
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 2020-03-06
  • 1970-01-01
相关资源
最近更新 更多