переменная пути не будет привязана к свойству объекта параметра метода контроллера - PullRequest
0 голосов
/ 03 марта 2020

Я не могу заставить 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 {

Ответы [ 2 ]

0 голосов
/ 03 марта 2020
    @GetMapping(value = "/customer/{type}/{id}/account/{accountNo}/operation")
public Mono<Response> getAccountHistory(@PathParam("type") String type, @PathParam("id") String id, @PathParam("account") String account) {
    CustomerData customerData = new CustomerData();
    customerData.setType(type);
    customerData.setId(id);
    customerData.setAccount(account);
    System.out.println("Customer data: " + customerData); return Mono.just(Response.builder().build()); }
0 голосов
/ 03 марта 2020

Я только что скопировал ваш код в пустой проект Spring Boot, и он работает нормально в браузере при доступе к нему так:

http://localhost:8080/customer/someType/someId/account/someAccount/operation

Однако ваш фрагмент тестирования выглядит неполным / неправильным и не устанавливается все параметры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...