Spring MVC - Aufrufen eines Rest-Service aus einem anderen Rest-Service heraus

Ich habe derzeit ein wirklich seltsames Problem, wenn ich einen REST-Service von einem anderen aus anrufe, und ich könnte mich wirklich an die Arbeit machen, um herauszufinden, was ich falsch mache.

So zunächst ein bisschen Kontext:

Ich habe eine Webanwendung, die einen REST-Service aufruft, um ein Benutzerkonto zu erstellen (für diese Erklärung lautet der Endpunkt localhost: 8080 / register). Zu Beginn der Benutzerreise habe ich einen anderen Dienst aufgerufen, um die Anmeldeinformationen des Benutzers zu erstellen.localhost:8090/signup aber ich muss einige Dinge im Aufruf von / register überprüfen, damit ich innerhalb des Aufrufs einen anderen Endpunkt auf 8090 anrufe, um diese Informationen zu erhalten localhost:8090/availability). Um es kurz zu machen, die Webapp ruft localhost auf: 8080 / register, die wiederum @ aufruflocalhost:8090/availability.

Wenn ich den Verfügbarkeitsendpunkt direkt von einem REST-Client oder der Webanwendung selbst aufrufe, funktioniert alles wie erwartet, aber aus irgendeinem seltsamen Grund erhalte ich ein HTTP415, wenn ich es vom Aufruf an den Registerendpunkt aus aufrufe. Hat jemand einen Einblick in das, was schief läuft?

Der Register-Controller sieht folgendermaßen aus:

@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;
}

Und der Verfügbarkeitscontroller sieht folgendermaßen aus:

@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;
}

Vollständige Offenlegung - in der Praxis werden von mir als Inhalt von createUser () tatsächlich mehrere Aufrufe des Aufrufstapels angezeigt, wobei dieselbe Klasse verwendet wird, mit der ich die Dienste von der Webanwendung aus aufrufe (was in diesem Kontext sehr gut funktioniert) ), und ich gebe nicht nur true in isUsernameAvailable zurück (weil das albern wäre), sondern dies ist die einfachste Version des Codes, der das Problem repliziert.

Meine aktuelle Annahme ist, dass ich etwas tue, das ich mir stürzen werde, wenn ich es sehe, aber ich habe zu lange auf diesen Code gestarrt, um ihn nicht mehr sehen zu können.

Bearbeite Vikdors Kommentar unten löste dieses Problem für mich. Ich habe die Methode createUser in @ geänder

@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;
}

Antworten auf die Frage(4)

Ihre Antwort auf die Frage