SpringBoot ignoring my @RequestBody param?

Tags: ,



I have the following Controller:

@Validated
@RestController
public class ProductController {
  @Autowired
  private ProductService productService;

  @PutMapping("/products/{productId}/costs")
  public ResponseEntity<Product> updateProductCost(@RequestHeader String authorization, @PathVariable UUID productId, @RequestBody ProductCost productCost) {
    Product updatedProduct = productService.updateProductCost(productId, productCost);

    return ResponseEntity.ok(updatedProduct);
  }
}

The ProductCost model looks like:

@Data
@NoArgsConstructor
@Entity
@Table(name = "product_costs", schema = "mws")
public class ProductCost implements Serializable {
  private static final long serialVersionUID = 1789128204447938816L;

  @Column
  private Double unitCost;

  @Column
  private Double shippingCost;

  @Column
  private Double pickPack;

  @Column
  private Double weightHandling;

  @Column
  private Double handling;

  @Column
  private Double fbaFee;

  @Column
  private Double referFee;

  @Column
  private String currencyCode;

  @CreationTimestamp
  private Date createdAt;

  @UpdateTimestamp
  private Date updatedAt;

  @Id
  @OneToOne
  @JoinColumn(name = "product_id")
  @JsonBackReference
  private Product product;

My problem is that when calling that endpoint, the productCost variable comes with all fields set to null, even though I’m seding it real data.

The request body looks like:

{
   productCost: {
     createdAt: "2020-08-22T21:22:33.989+0000"
     currencyCode: "USD"
     fbaFee: 0
     andling: 0
     pickPack: 0
     referFee: 0
     shippingCost: 0
     unitCost: 5
     updatedAt: "2020-08-22T21:22:33.989+0000"
     weightHandling: 0
   }
}

Am I missing something obvious? Why is the Product Cost not mapped correctly from my request’s body to the productCost variable in the controller?

Answer

Send only value of productCost.

{
     createdAt: "2020-08-22T21:22:33.989+0000"
     currencyCode: "USD"
     fbaFee: 0
     andling: 0
     pickPack: 0
     referFee: 0
     shippingCost: 0
     unitCost: 5
     updatedAt: "2020-08-22T21:22:33.989+0000"
     weightHandling: 0
   }

Because you are not enclosing productCost in any other class to parse the productCost key.



Source: stackoverflow