Spring MVC - Chamando um serviço de descanso de dentro de outro serviço de descanso
No momento, estou tendo um problema muito estranho ao chamar um serviço REST de dentro de outro e eu realmente poderia ajudar a descobrir o que estou fazendo de errado.
Então, primeiro, um pouco de contexto:
Eu tenho um aplicativo da web que solicita um serviço REST para criar uma conta de usuário (para fins desta explicação, o terminal é localhost: 8080 / register). No início da jornada do usuário, chamei um serviço diferente para criar as credenciais de login do usuáriolocalhost:8090/signup
mas preciso verificar algumas coisas na chamada para / registrar, de modo que, dentro da chamada, estou chamando para um terminal diferente no 8090 para obter essas informações (localhost:8090/availability
) Para encurtar a história, o webapp chama localhost: 8080 / register que, por sua vez, chamalocalhost:8090/availability
.
Quando ligo diretamente para o endpoint de disponibilidade, de um cliente REST ou do próprio webapp, tudo funciona como esperado, mas por algum motivo estranho, quando ligo de dentro da chamada para o endpoint de registro, recebo um HTTP415. Alguém tem alguma idéia do que está errado?
O controlador de registro fica assim:
@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;
}
E o controlador de disponibilidade fica assim:
@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;
}
Divulgação completa - na prática, o que mostrei como o conteúdo de createUser () são na verdade várias chamadas na pilha de chamadas, usando a mesma classe que eu uso para chamar os serviços do aplicativo da Web (que funciona perfeitamente nesse contexto) , e na verdade não estou apenas retornando true em isUsernameAvailable (porque isso seria bobo), mas esta é a versão mais simples do código que replica o problema.
Minha suposição atual é que estou fazendo algo que vou me expulsar quando o vir, mas estou encarando esse código há muito tempo para poder vê-lo mais.
Editar O comentário de Vikdor abaixo resolveu esse problema para mim. Alterei o método createUser para:
@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;
}