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[]>
。
我正在构建 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[]>
。