Json使用spring-boot向java对象请求body

我有以下
JSON请求

{
  "FreightCalculationRequest": {
    "Products": [
      {
        "sku": "123",
        "size": "S",
        "quantity": "1",
        "shipAlone": "True",
        "itemType": "Shoe"
      },
      {
        "sku": "123",
        "size": "S",
        "quantity": "1",
        "shipAlone": "True",
        "itemType": "Shoe"
      }
    ],
    "ShipToZip": "54452",
    "IsCommercial": "True"
  }
}

我试图将此请求作为自定义java对象发送到API控制器方法,然后将该对象作为json格式的字符串返回.我通过邮递员得到回复,但是对于产品,并且shiptoZip我得到一个null,而对于isCommercial,我得到了错误,但我甚至没有在请求中作为isCommercial的值.这是怎么回事?我不知道如何在Java中很好地调试,因为我基本上每次都通过键入mvn spring-boot来检查我的应用程序:start

这是我的对象,我将返回并用作控制器方法的参数.

public class FreightCalculationRequest {

    private Product[] Products;
    private String ShipToZip;
    private boolean IsCommercial;

    public Product[] getProducts() { return this.Products; }
    public void setProducts(Product[] itemsRequest) { this.Products = itemsRequest; }

    public String getShipToZip() { return this.ShipToZip; }
    public void setShipToZip(String ShipToZip) { this.ShipToZip = ShipToZip; }

    public boolean getIsCommercial() { return this.IsCommercial; }
    public void setIsCommercial(boolean IsCommercial) { this.IsCommercial = IsCommercial; }

}

这是我调用的控制器方法

@RequestMapping(value = "/test", produces = MediaType.APPLICATION_JSON_VALUE,  method = RequestMethod.POST)
FreightCalculationRequest TestCall(@RequestBody FreightCalculationRequest calculationRequest) {
    return calculationRequest;

}

为什么我的回复没有显示与请求相同的回复.

更新:
我将@JsonProperty添加到我的变量中,现在响应看起来像这样

{
    "isCommercial": false,
    "shipToZip": null,
    "products": null,
    "Products": null,
    "ShipToZip": null,
    "IsCommercial": false
}

丢失了一点,也意识到我可以在mvn运行时保存我的更改,它会自动编译更改

更新:
因此,当我最初在json响应中删除“FreightCalculationRequest”的包装时,我的json中的itemType实际上是抛出一个错误,所以我认为这是问题,但是itemType实际上是代码中的一个对象所以它是由于我而不是放入一个有效的属性并彻底阅读json解析错误,我有两个解决方案,将响应包装在另一个类中,或者删除FreightCalculationWrapping.

我还了解到我需要添加@JsonProperty来映射json

谢谢你

最佳答案

I am getting a response through postman however, for products, and
shiptoZip i get a null, and for isCommercial I get false, but i don’t
even have false as a value for isCommercial in the request. What’s
going on?

您必须将FreightCalculationRequest包装在新的模型类中.

制作一个新的Wrapper课程,

public class FreightCalculationRequestWrapper {
    @JsonProperty("FreightCalculationRequest")
    private FreightCalculationRequest freightCalculationRequest;

    ...
}

使用这个新的Wrapper类来处理您的请求:

@RequestMapping(value = "/test", produces = MediaType.APPLICATION_JSON_VALUE,  method = RequestMethod.POST)
FreightCalculationResponse TestCall(@RequestBody FreightCalculationRequestWrapper calculationRequest) {
    return calculationRequest;

}

此外,JSON中的属性名称以大写字母开头.

如果您使用的是Jackson,则可以在模型字段上使用@JsonProperty(…)注释来正确映射它们.

例如:

public class FreightCalculationRequest {
    @JsonProperty("Products")
    private Product[] Products;

    .
    .
    .
}
点赞