When the DataBinder uses setters it uses request parameters and path variables to fill the object. 😃

Given a class Customer:

class Customer {
  private int id;
  private String name;
    public void setId(int id) { this.id = id;}
    public void setName(String name) {this.name = name;}
    @Override public String toString() {return id + ":" + name;}
}

and a class CustomerController:

@RestController
@RequestMapping("customers")
class CustomerController {
  @PostMapping("{id}")
  void create(Customer customer) {
    System.out.println(customer);
  }
}

when you do a POST request to localhost:8080/customers/1?name=rod, the Customer is nicely filled and 1:rod appears on the console.

When the DataBinder uses a parametrized constructor it does not use path variables. 😟

Given a class Supplier:

class Supplier {
  private final int id;
  private final String name;
  Supplier(int id, String name) {this.id = id; this.name = name;}
  @Override public String toString() {return id + ":" + name;}
  }
}

and a class SupplierController:

@RestController
@RequestMapping("suppliers")
class SupplierController {
  @PostMapping("{id}")
  void create(Supplier supplier) {
    System.out.println(supplier);
  }
}

when you do a POST request to localhost:8080/suppliers/1?name=rod, you get java.lang.NoSuchMethodException: org.example.databinder.Supplier.<init>().

Comment From: rstoyanchev

This was covered by the changes for #26721, and in particular by ea398d7b7e72d1e1a9f7a002a291f4e0b8660e70.