Проблемы с ResponseEntity в RestTemplate

У меня есть две микросервисы, скажем, Microservice1 вызывает Microservice2 с помощью RestTemplate.

Метод обработчика в Microservice2 таков.

 @GetMapping("/careerRoles")
 public ResponseEntity<Map<String, Object>> getRole(@RequestParam(value = 
   "roleName", required = false) String roleName,
 @RequestParam(value = "domain", required = false) String domain,
 @RequestParam("proficiencyLevel") String proficiencyLevel,
 @RequestParam(value = "page", required = false) Integer page,
 @RequestParam(value = "limit", required = false) Integer limit) {
   Map<String, Object> query = new HashMap<>();
   Map<String, Object> json = new HashMap<>();

   if (page == null && limit == null) {
       page = 1;
       limit = 10;
   }
   query.put("page", page);
   query.put("limit", limit);
   List<Role> roles = new ArrayList<>();

   try {
       if (roleName == null) {
           query.put("proficiencyLevel", proficiencyLevel);

           roles = this.roleService.getRolesByProficiencyLevel(proficiencyLevel, page, limit);
       } else {
           query.put("proficiencyLevel", proficiencyLevel);
           query.put("roles", roleName);
           roles = this.roleService.getRolesByNameAndProficiencyLevel(roleName, proficiencyLevel, page, limit);

       }

       json.put("error", null);
       json.put("query", query);
       json.put("result", roles);
       return new ResponseEntity<Map<String, Object>>(json, HttpStatus.OK);

   } catch (RoleNotFoundException e) {
       json.put("error", e.getMessage());
       json.put("query", query);
       json.put("result", roles);
       return new ResponseEntity<Map<String, Object>>(json, HttpStatus.NOT_FOUND);
   }

 }

Вызывающий код в Microservice1 таков.

@GetMapping("careerRole")
public ResponseEntity<Map<String,Object>> getCareerRole(
  @RequestParam(value = "roleName", required = false) String roleName,
  @RequestParam(value = "domain", required = false) String domain,
  @RequestParam("proficiencyLevel") String proficiencyLevel,
  @RequestParam(value = "page", required = false) Integer page,
  @RequestParam(value = "limit", required = false) Integer limit) {

   HttpHeaders headers = new HttpHeaders();
   headers.setContentType(MediaType.APPLICATION_JSON);
   HttpEntity<String> entity = new HttpEntity<String>("Hello World!", 
     headers);
   UriComponentsBuilder builder = UriComponentsBuilder
           .fromUriString(uri)
           // Add query parameter
           .queryParam("roleName",roleName)
           .queryParam("proficiencyLevel", proficiencyLevel);
  Map<String,Object> map = restTemplate.getForObject(builder.toUriString(), 
    Map.class);
   return new ResponseEntity<Map<String,Object>>(map,HttpStatus.OK);
 }
}

Код работает и возвращает JSON, как ожидалось, когда я отправляю его в Microservice1, прослушивая порт 8081.

http://localhost:8081/api/v1/careerRoles?proficiencyLevel=Novice

Однако, если я отправлю два таких параметра запроса, код не будет выполнен.

http://localhost:8081/api/v1/careerRoles?roleName=Java Developer&proficiencyLevel=Novice

Однако, если я использую Postman для прямого доступа к микросервису 2 с обоими предыдущими запросами GET, результаты будут ожидаемыми.

Что я делаю не так? Заранее благодарю за любую помощь.

не могли бы вы добавить трассировку стека сбоев?

austin 12.12.2018 01:43

Используйте метод urlencoder.encode () для кодирования полного URL-адреса. Я думаю, что проблема возникает из-за пробела между Java и разработчиком

vinay chhabra 12.12.2018 01:58

На самом деле decode () помогло. Параметр запроса имел форму roleName = Java% 20Developer. После декодирования он стал roleName = Java Developer (с пробелом), и это сработало. Хотя странно.

user2693135 12.12.2018 04:59

На самом деле я все равно перепутал клиентский код и серверный, думаю, мой намек сработал .. Gr8

vinay chhabra 12.12.2018 10:13
0
4
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я уже сталкивался с этой проблемой раньше.

Пробел между java и разработчиком может создать проблему, поэтому расшифруйте его, прежде чем продолжить.

Другие вопросы по теме