【问题标题】:Spring Data JPA JpaRepository only uses No Arg ConstructorSpring Data JPA JpaRepository 仅使用 No Arg 构造函数
【发布时间】:2018-06-18 12:39:36
【问题描述】:

我有这个使用 Spring Boot 创建的简单 REST API。

在这个应用程序中,我有一个名为 Expense 的 POJO,它有 4 个字段。我有一个无参数构造函数和另一个只接受两个输入的构造函数。一个字符串值“item”和一个整数值“amount”。使用 LocalData.now() 方法设置日期,并在服务器中运行的 MySql db 中自动设置 ID。

这是我的实体类

@Entity
public class Expense {
    @Id
    @GeneratedValue (strategy = GenerationType.AUTO)
    private Integer id;
    private String date;
    private String item;
    private Integer amount;

    //No Arg Construction required by JPA
    public Expense() {
    }

    public Expense(String item, Integer amount) {
        this.date = LocalDate.now().toString();
        this.item = item;
        this.amount = amount;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getItem() {
        return item;
    }

    public void setItem(String item) {
        this.item = item;
    }

    public Integer getAmount() {
        return amount;
    }

    public void setAmount(Integer amount) {
        this.amount = amount;
    }
}

我有另一个带有 RestController 注释的类,其中我设置了一个方法来使用请求映射注释的 post 方法发布 Expense 对象。

@RestController
public class ExpController {

    private ExpService expService;
    private ExpenseRepo expenseRepo;

    @Autowired
    public ExpController(ExpService expService, ExpenseRepo expenseRepo) {
        this.expService = expService;
        this.expenseRepo = expenseRepo;
    }


    @RequestMapping(path = "/addExp", method=RequestMethod.POST)
    public void addExp(Expense expense){
        expenseRepo.save(expense);
  }    
}

现在我终于使用 PostMan 发出 HTTP Post 请求。我制作了一个简单的 Json 格式文本来发送项目和金额

    {
        "item":"Bread",
        "amount": 75
    }

发出 post 请求后,我只能看到创建了一个新条目,但所有值都设置为 null。

我做了一些实验,发现expenseRepo.save(expense)方法只是使用默认的no Arg构造函数来保存数据。但它没有使用第二个构造函数,它接受我通过 Postman 传递的两个参数

如何解决这个问题。请帮忙

【问题讨论】:

    标签: spring rest spring-boot


    【解决方案1】:

    像这样改变你的控制器方法

    @RequestMapping(path = "/addExp", method=RequestMethod.POST)
    public void addExp(@RequestBody Expense expense){
            expenseRepo.save(expense);
    }   
    

    你需要使用@RequestBody

    【讨论】:

    • 哇,谢谢。它真的奏效了。只有一个问题,日期设置为空。我再次发现 JpaRepository 使用的是 no Arg 构造函数。我在无参数构造函数主体中设置了 LocalDate.now() 方法,现在它正在更新日期。有没有办法指示SpringBoot强制使用第二个构造函数??
    • 你混合了很多东西。 1. spring data / JpaRepository,当您从 Postman 发送数据并在控制器中接收数据时,根本不会出现。 2. spring-data 只有当你调用expenseRepo.save(expense); 时才会出现。此时进行调试,看看日期是否为空。 3.我不相信spring会在你调用API时调用你的构造函数来为你的类设置值。它使用反射并直接设置值。因此,一旦您在控制器中收到费用对象。调用expense.setDate(...) 而不是在控制器中设置。
    猜你喜欢
    • 2019-03-27
    • 2017-04-30
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 2016-01-23
    • 2020-05-03
    • 1970-01-01
    相关资源
    最近更新 更多