Ich versuche, spring-boot-starter-web
zu verwenden, um einen Rest-Service zu erstellen, der JSON-Repräsentationen von Java-Objekten bereitstellt. Nach meinem Verständnis soll dieser Boot-Starter-Web-Jar die Konvertierung in JSON durch Jackson automatisch abwickeln, aber ich bekomme stattdessen diesen Fehler.
{ "timestamp": 1423693929568,
"status": 406,
"error": "Not Acceptable",
"exception": "org.springframework.web.HttpMediaTypeNotAcceptableException",
"message": "Could not find acceptable representation"
}
Mein Controller ist das ...
@RestController
@RequestMapping(value = "/media")
public class MediaController {
@RequestMapping(value = "/test", method = RequestMethod.POST)
public @ResponseBody UploadResult test(@RequestParam(value="data") final String data) {
String value = "hello, test with data [" + data + "]";
return new UploadResult(value);
}
@RequestMapping(value = "/test2", method = RequestMethod.POST)
public int test2() {
return 42;
}
@RequestMapping(value = "/test3", method = RequestMethod.POST)
public String test3(@RequestParam(value="data") final String data) {
String value = "hello, test with data [" + data + "]";
UploadResult upload = new UploadResult(value);
return upload.value;
}
public static class UploadResult {
private String value;
public UploadResult(final String value)
{
this.value = value;
}
}
}
Mein pom.xml
hat ...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-Tomcat</artifactId>
<version>1.2.1.RELEASE</version>
<scope>provided</scope>
</dependency>
mvn dependency:tree
zeigt, dass spring-boot-starter-web tatsächlich von der jackson2.4-Datenbank abhängig ist und daher auf dem Klassenpfad stehen sollte ...
[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:1.2.1.RELEASE:compile
[INFO] | +- org.springframework.boot:spring-boot-starter:jar:1.2.1.RELEASE:compile
[INFO] | | +- org.springframework.boot:spring-boot:jar:1.2.1.RELEASE:compile
[INFO] | | +- org.springframework.boot:spring-boot-autoconfigure:jar:1.2.1.RELEASE:compile
[INFO] | | +- org.springframework.boot:spring-boot-starter-logging:jar:1.2.1.RELEASE:compile
[INFO] | | | +- org.slf4j:jul-to-slf4j:jar:1.7.8:compile
[INFO] | | | \- org.slf4j:log4j-over-slf4j:jar:1.7.8:compile
[INFO] | | \- org.yaml:snakeyaml:jar:1.14:runtime
[INFO] | +- com.fasterxml.jackson.core:jackson-databind:jar:2.4.4:compile
[INFO] | | +- com.fasterxml.jackson.core:jackson-annotations:jar:2.4.0:compile
[INFO] | | \- com.fasterxml.jackson.core:jackson-core:jar:2.4.4:compile
[INFO] | +- org.hibernate:hibernate-validator:jar:5.1.3.Final:compile
[INFO] | | +- javax.validation:validation-api:jar:1.1.0.Final:compile
[INFO] | | +- org.jboss.logging:jboss-logging:jar:3.1.3.GA:compile
[INFO] | | \- com.fasterxml:classmate:jar:1.0.0:compile
[INFO] | +- org.springframework:spring-web:jar:4.1.4.RELEASE:compile
[INFO] | | +- org.springframework:spring-aop:jar:4.1.4.RELEASE:compile
[INFO] | | | \- aopalliance:aopalliance:jar:1.0:compile
[INFO] | | +- org.springframework:spring-beans:jar:4.1.4.RELEASE:compile
[INFO] | | \- org.springframework:spring-context:jar:4.1.4.RELEASE:compile
[INFO] | \- org.springframework:spring-webmvc:jar:4.1.4.RELEASE:compile
[INFO] | \- org.springframework:spring-expression:jar:4.1.4.RELEASE:compile
... der Aufruf des Dienstes test
führt jedoch zu dem oben genannten Fehler. test2
und test3
funktionieren einwandfrei, um zu beweisen, dass es nur der Versuch der Konvertierung in JSON ist, der fehlschlägt? Fehlen mir Konfigurationsprobleme oder Anmerkungen? Von allen Beispielen, die ich finden kann, ist das Kommentieren der Klasse für die grundlegende Jackson JSON-Konvertierung nicht mehr erforderlich.
Jede Hilfe sehr geschätzt.
Sie haben keine öffentlichen Getter für Ihr UpdateResult, zum Beispiel:
public static class UploadResult {
private String value;
public UploadResult(final String value)
{
this.value = value;
}
public String getValue() {
return this.value;
}
}
Ich glaube, dass die automatische Erkennung standardmäßig aktiviert ist und versuchen wird, Ihre Getter zu ermitteln. Sie können es mit @JsonAutoDetect(getterVisibility=Visibility.NONE)
deaktivieren und in Ihrem Beispiel []
ergeben.
Ich hatte einen ähnlichen Fehler bei der Verwendung von spring/jhipster
RESTful (über Postman
).
Der Endpunkt war so etwas wie:
@RequestMapping(value = "/index-entries/{id}",
method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
public ResponseEntity<IndexEntry> getIndexEntry(@PathVariable Long id) {
Ich habe versucht, den Endpunkt restful
über Postman
mit dem Header Accept: text/plain
aufzurufen, musste jedoch Accept: application/json
verwenden.
Auch ich stand vor einem ähnlichen Problem. In meinem Fall akzeptierte der Anforderungspfad die Mail-ID als Pfadvariable, sodass der URI wie .__ aussah. /some/api/[email protected]
Aufgrund des Pfads stellte Spring fest, dass der URI eine Datei mit der Erweiterung ".com" abruft und versuchte, einen anderen Medientyp als Antwort zu verwenden, als beabsichtigt. Nachdem ich path variable in request param gemacht hatte, funktionierte es für mich.
Mein Rückkehrobjekt hatte keine @XmlRootElement-Annotation für die Klasse. Durch das Hinzufügen der Anmerkung wurde mein Problem behoben.
@XmlRootElement(name = "ReturnObjectClass")
public class ReturnObjectClass {
@XmlElement(name = "Status", required = true)
protected StatusType status;
//...
}
Wenn Sie @FeignClient verwenden, fügen Sie z.
produces = "application/json"
in der @RequestMapping-Anmerkung
In meinem Fall habe ich zufällig Lombok verwendet und anscheinend gibt es Konflikte mit get und set
die akzeptierte Antwort stimmt nicht mit Spring 5 überein. Versuchen Sie, die URL Ihres Webservices in .json zu ändern. das ist die richtige Lösung. tolle Details hier http://stick2code.blogspot.com/2014/03/solved-orgspringframeworkwebhttpmediaty.html
Ich musste die Abhängigkeit für meine Json-Bibliothek in meinem POM explizit angeben.
Nachdem ich die unten genannte Abhängigkeit hinzugefügt hatte, funktionierte alles.
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
Add Below-Abhängigkeit:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.4.6</version>
</dependency>
Ich hatte die gleiche Ausnahme, aber die Ursache war anders und ich konnte keine Informationen dazu finden, also werde ich sie hier posten. Es war einfach ein Fehler zu übersehen.
Schlecht:
@RestController(value = "/api/connection")
Gut:
@RestController
@RequestMapping(value = "/api/connection")
Fügen Sie über der Pojo-Klasse, die Sie deserialisieren möchten, eine @ Data-Annotation hinzu. Das Problem ist für mich gelöst :)
Zum Beispiel,
import lombok.Data;
@Data
public class Response {
private Integer status;
private String type;
}