为什么在控制器中从邮递员请求中收到空值?

时间:2019-07-15 07:33:52

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

我编写了一个rest控制器,该控制器接收一个请求并将数据保存在db中。 这是我尝试使用邮递员发送的发布请求

{
    "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”并更新Entity类,从而将“ Id”作为主键并尝试执行,那么我将在请求正文中获取正确的值并将其保存在数据库也是如此。

需要帮助。

1 个答案:

答案 0 :(得分:1)

  

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

Doc

下划线_ 是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;

UPDATE1

为什么product_id仅为空

要发现我在IDE中粘贴了相同的代码,并发现 Entity Product缺少字段product_id 的获取方法。添加后,相同的代码会将值保存到数据库。但是,我仍然 建议大家避免使用该字段名称中的_ ,以避免出现进一步的问题,并遵循文档的命名约定。使用JPA时,例如findBy(实体名称中带有_的东西),您可能会遇到类似于this

的问题