it-swarm.com.de

Spring @RestController gibt keine Klartextantwort zurück

Ich experimentiere mit dem neuen Spring 4.0 @RestController, um eine einfache Textantwort von einem Controller zurückzugeben:

@RestController
@RequestMapping(value = "/heartbeat")
public class HeartbeatController {

    private static final Logger logger = LoggerFactory.getLogger(HeartbeatController.class);

    @RequestMapping
    public String heartbeat() {
        logger.info("Received heartbeat!");
        return "I'm Alive!";
    }

    @RequestMapping(value = "/test", produces = MediaType.TEXT_PLAIN_VALUE)
    public String heartbeat2() {
        logger.info("Received heartbeat!");
        return "I'm Alive!";
    }
}

Wenn ich auf/heartbeat zugreife, bekomme ich zurück:

"I'm Alive!"

Das Ergebnis enthält die doppelten Anführungszeichen, was ich nicht erwartet hatte.

Wenn ich auf/heartbeat/test zugreife, erhalte ich eine leere Antwort zurück, aber ich erwarte, dass I'm Alive! Text.

UPDATE

curl -i http://myserver.com/rest/heartbeat

HTTP/1.1 200 OK Inhaltstyp: application/json; charset = UTF-8 Server: Development/1.0 Datum: Di, 17. Dez 2013 18:59:08 GMT Cache-Steuerung: no-cache Läuft ab am: Fr, 01 Jan 1990 00:00:00 GMT Länge des Inhalts: 12

"Ich lebe!"

curl -i -H "Akzeptieren: application/json" http://myserver.com/rest/heartbeat HTTP/1.1 200 OK Inhaltstyp: application/json; charset = UTF-8 Server: Development/1.0 Datum: Di, 17. Dez 2013 19:01:12 GMT Cache-Kontrolle: no-cache Läuft ab am: Fr, 01 Jan 1990 00:00:00 GMT Länge des Inhalts: 12

"Ich lebe!"

curl -i http://myserver.com/rest/heartbeat/test

HTTP/1.1 406 Nicht akzeptabel Server: Entwicklung/1.0 Datum: Di, 17. Dez 2013 19:00:13 GMT Cache-Steuerung: no-cache Läuft ab am: Fr, 01 Jan 1990 00:00:00 GMT Content-Length: 0

curl -i -H "Accept: text/plain" http://myserver.com/rest/heartbeat/test

HTTP/1.1 406 Nicht akzeptabel Server: Entwicklung/1.0 Datum: Di, 17. Dez 2013 19:02:06 GMT Cache-Steuerung: no-cache Läuft ab am: Fr, 01 Jan 1990 00:00:00 GMT Content-Length: 0

11
Marcel Overdijk

Ich habe herausgefunden, dass ich den StringHttpMessageConverter in den configureMessageConverters meiner WebConfig vermisst habe. Ich habe die Nachrichtenkonverter so konfiguriert, dass sie den Jackson ObjectMapper steuern.

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
    mappingJackson2HttpMessageConverter.setPrettyPrint(SystemProperty.environment.value() == Development);
    mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper());
    converters.add(mappingJackson2HttpMessageConverter);
    converters.add(new StringHttpMessageConverter()); // THIS WAS MISSING
}
17
Marcel Overdijk

@RestController ist eine praktische Annotation, bei der Sie keine @ResponseBody-Annotation mehr für Ihre Methoden angeben müssen.

Dies bedeutet jedoch, dass Ihr Antworttyp standardmäßig JSON ist und daher in Anführungszeichen eingeschlossen wird, um eine ordnungsgemäße Bildung zu gewährleisten.

4
englishteeth

@RestController kombiniert @Controller und @ResponseBody in Ihrer Controller-Klasse als in der Dokumentation angegeben .

Wenn Sie eine Methode/einen Controller mit @ResponseBody annotieren, unterstützt Spring Sie bei der Inhaltsaushandlung, indem der HTTP-Anforderungsheader Accept und das Attribut produces in Ihrer Annotation verwendet werden.

In Ihrem Fall:

  • Sie erhalten eine application/json-Antwort für Ihre Heartbeat-Aktion, da Ihr HTTP-Client wahrscheinlich nach dem Inhaltstyp fragt und Spring die Inhaltsaushandlung durchgeführt hat.
  • Sie erhalten ein HTTP 406 für Ihre Aktion "hearbeat2", da die Inhaltsaushandlung fehlgeschlagen ist. Sie haben text/plain als produzierten Inhaltstyp auf Ihrem Controller angegeben, während Ihr HTTP-Client wahrscheinlich nur application/json im Anforderungsheader für Accept auflistet.

Update : Ich habe genau die gleichen Curl-Anforderungen verwendet, bekomme aber nicht die gleichen Ergebnisse. Vielleicht ändert ein Filter oder ein HTTP-Proxy-Cache HTTP-Header?

Das Standardformat ist text/plain:

➜ curl -v http://localhost:8080/heartbeat
> GET /heartbeat HTTP/1.1
> User-Agent: curl/7.30.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: Apache-Coyote/1.1
< Content-Type: text/plain;charset=ISO-8859-1
< Content-Length: 13
< Date: Wed, 18 Dec 2013 13:34:12 GMT
<
Hello, World!%

Und mit einem produces text/plain Attribut:

➜ curl -H "Accept: text/plain" -v http://localhost:8080/heartbeat/test
> GET /heartbeat/test HTTP/1.1
> User-Agent: curl/7.30.0
> Host: localhost:8080
> Accept: text/plain
>
< HTTP/1.1 200 OK
< Server: Apache-Coyote/1.1
< Content-Type: text/plain
< Content-Length: 13
< Date: Wed, 18 Dec 2013 13:39:07 GMT
<
Hello, World!%

Diese Beispielanwendung macht dasselbe und erzielt gute Ergebnisse.

2
Brian Clozel

Das funktioniert bei mir:

  1. füge dies in maven hinzu

    com.fasterxml.jackson.core jackson-databind 2.4.4

  2. stellen Sie sicher, dass <mvc:annotation-driven /> im Frühjahr konfiguriert ist

0
cn123h

Diese Lösung hat bei mir funktioniert. Bitte überprüfen Sie die folgenden Punkte.

  1. Stellen Sie sicher, dass Ihr DTO serialisierbar ist und serialisierbare Felder, Getter und Setter enthält
  2. Überprüfen Sie die Abhängigkeiten für Jackson. Du solltest haben
    • com.fasterxml.jackson.core: jackson-core: 2.4.1
    • com.fasterxml.jackson.core: jackson-databind: 2.4.1
    • com.fasterxml.jackson.core: jackson-annotations: 2.4.1
    • com.fasterxml.jackson.datatype: jackson-datatype-joda: 2.4.1
    • com.fasterxml.jackson.datatype: jackson-datatype-jsr310: 2.4.1
  3. Korrigieren Sie die RequesMapping-Anmerkung:

    @RequestMapping(value = "/test", consumes = "*/*")

  4. Überprüfen Sie, ob Sie eine <mvc:annotation-driven />-Direktive haben

0
Fırat KÜÇÜK