Вызов шаблона Rest с параметром и в списке ответов - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь передать номер мобильного телефона с помощью RestTemplate на мой контроллер. Затем этот контроллер вернет List<TransactionDetailsVO>, который я должен получить, используя RestTemplate.

До сих пор я пытался передать параметр, используя HttpEntity:

String callbackUrl = URI.create(new StringBuilder("http://localhost:8080").append("/api/getTransactionByMobile").toString());

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity<String> entity = new HttpEntity<String>(mobileNumber, headers);

ResponseEntity<List<TransactionDetailsVO>> response = restTemplate.exchange(callbackUrl, 
    HttpMethod.POST, 
    entity, 
    new ParameterizedTypeReference<List<TransactionDetailsVO>>() {
    });

Однако, когда я использую этот код и проверяю, был ли передан параметр в моем контроллере, он регистрирует, что параметр мобильного номера равен null.

Контроллер, который я использую, следующий:

@PostMapping(value = "/getTransactionByMobile")
public List<TransactionDetailsVO> getTransactionDetailsByMobile(String mobileNo) {
    List<TransactionDetailsVO> transactionDetailsVO = new ArrayList<>();
    return transactionDetailsVO;
}

Почему mobileNo пуст в моем контроллере, хотя я передаю его в RestTemplate?

1 Ответ

0 голосов
/ 18 июня 2019

Если вы не аннотируете свои параметры в контроллере, Spring сделает предположение, как указано в документации :

Обратите внимание, что использование @RequestParam необязательно (например, для установки его атрибутов). По умолчанию любой аргумент, который является простым типом значения (как определено BeanUtils#isSimpleProperty) и не разрешен никаким другим распознавателем аргумента, обрабатывается так, как если бы он был аннотирован @RequestParam.

В вашем случае у вас есть параметр String с именем mobileNo, и он рассматривается как простой параметр и, таким образом, отображается как если бы это был @RequestParam.

Это означает, что вы можете отправить номер мобильного телефона, только передав его в качестве параметра:

// You should pass the parameter like this
String callback = "http://localhost:8080/api/getTransactionByMobile?mobileNo=(123)4567";

В качестве альтернативы, если вы действительно хотите передать его как тело запроса, вы должны аннотировать свой параметр в контроллере с помощью @RequestBody:

@PostMapping(value = "/getTransactionByMobile")
public List<TransactionDetailsVO> getTransactionDetailsByMobile(
    @RequestBody String mobileNo // Add @RequestBody
) {
    // ...
}

Это именно то, что Адитья предложил в комментариях .

...