Я не могу заставить Spring MVC привязать переменные пути к своему пользовательскому объекту.
Учитывая следующий метод контроллера:
@GetMapping(value = "/customer/{type}/{id}/account/{accountNo}/operation")
public Mono<Response> getAccountHistory(CustomerData customerData) {
System.out.println("Customer data: " + customerData);
return Mono.just(Response.builder().build());
}
Класс DTO:
public class CustomerData {
private String id;
private String type;
private String accountNo;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getAccountNo() {
return accountNo;
}
public void setAccountNo(String accountNo) {
this.accountNo = accountNo;
}
@Override
public String toString() {
return "CustomerData{" +
"id='" + id + '\'' +
", type='" + type + '\'' +
", accountNo='" + accountNo + '\'' +
'}';
}
И тестовый фрагмент
client.get().uri(uriBuilder -> uriBuilder
.path("/customer/{type}/{id}/account/{accountNo}/operation")
.build("TYPE", "12345678", "11102055610000350203650330")
).accept(APPLICATION_JSON)
.exchange()
Я получаю вывод
Customer data: CustomerData(id=null, type=null, accountNo=null)
Таким образом, ни одна переменная пути не привязана к объекту.
Однако привязка к простым типам с использованием @ PathVariable работает как чудо - изменение определения метода контроллера на
@GetMapping(value = "/customer/{type}/{id}/account/{accountNo}/operation")
public Mono<Response> getAccountHistory(@PathVariable("type") String type, @PathVariable("id") String id,
@PathVariable("accountNo") String accountNo) {
val customerData = new CustomerData();
customerData.setAccountNo(accountNo);
customerData.setType(type);
customerData.setId(id);
System.out.println("Customer data: " + customerData);
return Mono.just(Response.builder().build());
}
Создает ожидаемый вывод:
Customer data: CustomerData{id='12345678', type='TYPE', accountNo='11102055610000350203650330'}
Что я делаю неправильно?
Мой класс контроллера помечено
@RestController
public class Controller {