Spring Data JPA JpaRepository仅使用No Arg构造函数

时间:2018-06-18 12:39:36

标签: spring rest spring-boot

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

在这个应用程序中,我有一个名为Expense的POJO,有4个字段。我有一个没有Argument构造函数和另一个只带两个输入的构造函数。一个字符串值" item"和一个整数值"金额"。使用LocalData.now()方法设置日期,并在服务器中运行的MySql数据库中自动设置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注释的类,其中我设置了一个方法,使用Request Mapping注释使用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 Request。我已经制作了一个简单的Json格式文本来发送项目和金额

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

在我发布帖子请求后,我只能看到创建了一个新条目,但所有值都设置为空。

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

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

1 个答案:

答案 0 :(得分:1)

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

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

您需要使用@RequestBody