RestTemplate Spring 启动 400 错误 Servlet.service() for servlet [dispatcherServlet] 在路径 [] 的上下文中抛出 exceptiOn 方法工作休息不

RestTemplate Spring boot 400 error Servlet.service() for servlet [dispatcherServlet] in context with path [] threw excepti. One method works rest dont

我正在构建 spring 引导微服务并使用 REST 模板在微服务之间进行通信(通过 eureka API 网关)。奇怪的是,从一项服务到另一项服务的简单请求返回一个字符串有效,但任何其他请求都出现以下错误:

26 --- [nio-9010-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.HttpClientErrorException$BadRequest: 400 : [{"timestamp":"2021-08-17T14:15:18.209+00:00","status":400,"error":"Bad Request","path":"/accounts/findbycustomernumber"}]] with root cause
org.springframework.web.client.HttpClientErrorException$BadRequest: 400 : [{"timestamp":"2021-08-17T14:15:18.209+00:00","status":400,"error":"Bad Request","path":"/accounts/findbycustomernumber"}]
    at org.springframework.web.cl

我有一个 CustomerProfile 微服务,它应该从 BankAccount 微服务中获取一个“帐户”实体。在我的 BankAccountService.controller 中,我有 2 种方法(都可以正常工作:

@GetMapping("/test")
public String test() {
    return "Hello World";
}

 @GetMapping("/findbycustomernumber")
public ResponseEntity<List<Account>> findbycustomernumber(@RequestParam String customernumber) {
    log.info("Inside AccountController::findByCustomerID()");
    System.out.println("Customer number: " + customernumber);
    List<Account> findByCustomerNumberAccounts =
            accountService.findbycustomernumber (customernumber);
    return new ResponseEntity<List<Account>>(
            accountService.findbycustomernumber(customernumber),
            HttpStatus.OK
    );
}

在我的 CustomerProfile 控制器中,我有 2 个方法:

@GetMapping("/test")
public ResponseEntity<String> test() {
    return customerProfileService.test();
}

@GetMapping("findbycustomernumber")
public ResponseEntity<Account> findByCustomerNumber(@RequestParam String customernumber) {
    log.info("Inside: /CustomerProfileController/findbycustomernumber");
    return customerProfileService.findByCustomerNumber(customernumber);
}

在使用rest模板的服务包中它们各自的方法是:

public ResponseEntity<String> test() {
    ResponseEntity<String> response = restTemplate.getForEntity(
            "http://BANK-ACCOUNT-SERVICE/accounts/test",
            String.class);

    return response;
}

public ResponseEntity<Account> findByCustomerNumber(String customernumber) {
    log.info("Inside CustomerProfileService::findByCustomerNumber()");
    String url = "http://BANK-ACCOUNT-SERVICE/accounts/findbycustomernumber";
    HttpHeaders requestHeaders = new HttpHeaders();
    requestHeaders.setContentType(MediaType.APPLICATION_JSON);
    HttpEntity<String> request = new HttpEntity<>(customernumber, requestHeaders);



    ResponseEntity<Account> response = restTemplate.exchange(url, HttpMethod.GET, request, Account.class);
    return response;
}

使用邮递员,如果我向 localhost:9191/customerprofile/test 发送请求(9191 因为我使用的是 netflix eureka API 网关),该方法工作正常。请求旅程是client->API-Gateway->CustomerProfileService.controller->CustomerProfileService.service->BankAccouunttService.controller->client.

但是第二种方法,findbycustomernumber,实现方式相同returns 400 错误代码,找不到路径。为什么一个有效而另一个无效,当一切都实施相同时?

出于隐私考虑,我对代码进行了一些编辑,因此您可能会注意到可能与此问题无关的小错误。但是,由于客户资料服务 class 中的一个 RestTemplate 请求正在运行而另一个没有运行,我确信问题出在我调用 restTemplate 方法的方式上。我已经尝试了所有方法 getForEntity、getForObject 和 Exchange,但我总是得到同样的错误。

找了好久。我知道网上有类似的问题,但我仍然一无所获。 谢谢

400 错误请求是由于缺少 API 的查询参数造成的。

尝试在 rest 模板中提供如下 url

UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(url)
        // Add query parameter
        .queryParam("customernumber", customernumber);
HttpEntity<?> request = new HttpEntity<>(requestHeaders);

ResponseEntity<Account> response = restTemplate.exchange(builder.toUriString(), HttpMethod.GET, request, Account.class);
return response;

@MidhunMohan 是公认的答案,但我还想指出: Get list of JSON objects with Spring RestTemplate

在我上面的问题中,我接受了 ReponseEntity<List<Account>> 而应该是 ResponseEntity<Account[]>