@RequestBody 变量返回空属性

@RequestBody variable returning null properties

我写了一个控制器来接收 post 请求 posts json 但是当我尝试访问对象字段时它 returns 为空。控制器的代码如下

package com.example;

import com.example.Services.ZesaServices;
import com.example.models.Zesa.ZesaRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class MoneyResource {

@RequestMapping("/services")
public String getServices(){
    return "We do everything";
}

@PostMapping(value="/zesa")
public String payZesa(@RequestBody ZesaRequest newZesaRequest){

    Logger log = LoggerFactory.getLogger(YomoneyResource.class);
    log.info("Json Object parsed works eg: "+newZesaRequest.getMeterNumber());


    return newZesaRequest.getMeterNumber().toString();
  }
}

而ZesaRequest对象如下

package com.example.models.Zesa;

public class ZesaRequest {
private Double Amount;
private String MeterNumber;
private String PaymentAccountNumber;
private String PaymentAccountDetails;
private int PaymentMethod;
private String MobileNumber;
private String AgentAccountDetails;
private int TransactionType;

public ZesaRequest() {
}


public ZesaRequest(Double amount, String meterNumber, String paymentAccountNumber, String paymentAccountDetails,
                   int paymentMethod, String mobileNumber, String agentAccountDetails, int transactionType) {
    this.Amount = amount;
    this.MeterNumber = meterNumber;
    this.PaymentAccountNumber = paymentAccountNumber;
    this.PaymentAccountDetails = paymentAccountDetails;
    this.PaymentMethod = paymentMethod;
    this.MobileNumber = mobileNumber;
    this.AgentAccountDetails = agentAccountDetails;
    this.TransactionType = transactionType;
}


public String getPaymentAccountDetails() {
    return PaymentAccountDetails;
}

public void setPaymentAccountDetails(String paymentAccountDetails) {
    PaymentAccountDetails = paymentAccountDetails;
}

public String getMobileNumber() {
    return MobileNumber;
}

public void setMobileNumber(String mobileNumber) {
    MobileNumber = mobileNumber;
}


public Double getAmount() {
    return Amount;
}

public void setAmount(Double amount) {
    Amount = amount;
}

public String getMeterNumber() {
    return MeterNumber;
}

public void setMeterNumber(String meterNumber) {
    MeterNumber = meterNumber;
}

public String getPaymentAccountNumber() {
    return PaymentAccountNumber;
}

public void setPaymentAccountNumber(String paymentAccountNumber) {
    PaymentAccountNumber = paymentAccountNumber;
}

public int getPaymentMethod() {
    return PaymentMethod;
}

public void setPaymentMethod(int paymentMethod) {
    PaymentMethod = paymentMethod;
}

public String getAgentAccountDetails() {
    return AgentAccountDetails;
}

public void setAgentAccountDetails(String agentAccountDetails) {
    AgentAccountDetails = agentAccountDetails;
}

public int getTransactionType() {
    return TransactionType;
}

public void setTransactionType(int transactionType) {
    TransactionType = transactionType;
}
}

当我发送下面的请求时,我的代码正在打印 null

{
   "AgentAccountDetails":"example:123",
   "MeterNumber":"1110-52-8867",
   "PaymentMethod":1,
   "Amount":10.50,
   "MobileNumber":"0123456789",
   "TransactionType":1,
   "PaymentAccountNumber":"0123456789",
   "PaymentAccountDetails":"null"
}

当我 运行 它是 returns 一个空字符串。我不确定问题出在哪里我查看了其他示例并且它们遵循类似的模式并且我 运行 他们的代码并且它按预期工作但我的似乎没有将 json 主体转换为Java 对象。

您的 class 定义了一个名为 meterNumberproperty,但您的 JSON 对象却说 MeterNumber

如果您的 JSON 中必须包含 MeterNumber,则需要添加 @JsonProperty 注释。

字段名称以大写字母开头违反了Java和JSON命名约定。

顺便说一句,您可以使用 Lombok:

来避免所有样板文件
@Data
public class ZesaRequest {
    @JsonProperty("Amount")
    private Double amount;

    @JsonProperty("MeterNumber")
    private String meterNumber;

    @JsonProperty("PaymentAccountNumber")
    private String paymentAccountNumber;

    @JsonProperty("PaymentAccountDetails")
    private String paymentAccountDetails;

    @JsonProperty("PaymentMethod")
    private int paymentMethod;

    @JsonProperty("MobileNumber")
    private String mobileNumber;

    @JsonProperty("AgentAccountDetails")
    private String agentAccountDetails;

    @JsonProperty("TransactionType")
    private int transactionType;
}

您可能也不想要 "PaymentAccountDetails":"null"。它应该是 "PaymentAccountDetails":null,或者完全省略。

您可以通过在字段上方使用 @JsonProperty 注释来解决此问题,如下所示:

...
@JsonPropety(value = "Amount")
private Double amount;
...

或者您可以重命名您的属性以小写字母开头(在 VM 和传入 json 中),如评论中建议的 @OrangeDog