Spring MVC - вызов службы отдыха из другой службы отдыха
В настоящее время у меня действительно странная проблема с вызовом одного REST-сервиса из другого, и я действительно могу использовать руку, чтобы понять, что я делаю неправильно.
Итак, сначала немного контекста:
У меня есть веб-приложение, которое вызывает службу REST для создания учетной записи пользователя (ради этого объяснения конечной точкой является localhost: 8080 / register). Ранее в пути пользователя я вызвал другой сервис для создания учетных данных пользователя.localhost:8090/signup
но мне нужно проверить несколько вещей в вызове / зарегистрироваться, поэтому внутри вызова я обращаюсь к другой конечной точке на 8090, чтобы получить эту информацию (localhost:8090/availability
). Короче говоря, веб-приложение вызывает localhost: 8080 / register, который, в свою очередь, вызываетlocalhost:8090/availability
.
Когда я вызываю конечную точку доступности напрямую из клиента REST или из самого веб-приложения, все работает как положено, но по какой-то странной причине, когда я вызываю ее изнутри вызова конечной точки регистра, я получаю HTTP415. У кого-нибудь есть понимание того, что происходит не так?
Контроллер регистра выглядит так:
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.OK)
public UserModel createUser(@RequestBody UserModel userModel) throws InvalidSignupException {
// a load of business logic that validates the user model
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Boolean> response = restTemplate.postForEntity("http://localhost:8090/availability",
userModel.getUsername(), Boolean.class);
System.out.println(response.getBody());
// a load more business logic
return userModel;
}
И контроллер доступности выглядит так:
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.OK)
public Boolean isUsernameAvailable(@RequestBody String username) {
// a load of business logic that returns a boolean
return Boolean.TRUE;
}
Полное раскрытие - на практике то, что я показал как содержимое createUser (), на самом деле представляет собой несколько вызовов стека вызовов, используя тот же класс, который я использую для вызова сервисов из веб-приложения (что прекрасно работает в этом контексте) и я на самом деле не просто возвращаю true в isUsernameAvailable (потому что это было бы глупо), но это самая простая версия кода, которая повторяет проблему.
Мое текущее предположение состоит в том, что я делаю что-то, что я собираюсь опрокинуть, когда увижу это, но я слишком долго смотрел на этот код, чтобы больше его видеть.
редактировать Комментарий Викдора ниже решил эту проблему для меня. Я изменил метод createUser на:
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.OK)
public UserModel createUser(@RequestBody UserModel userModel) throws InvalidSignupException {
// a load of business logic that validates the user model
RestTemplate restTemplate = new RestTemplate();
restTemplate.setMessageConverters(Arrays.asList(new MappingJackson2HttpMessageConverter()));
ResponseEntity<Boolean> response = restTemplate.postForEntity("http://localhost:8090/availability",
userModel.getUsername(), Boolean.class);
System.out.println(response.getBody());
// a load more business logic
return userModel;
}