Essayez d'utiliser le Printemps de Démarrage RESTE à Lire JSON Chaîne de POST
Suis en utilisant la dernière version de Printemps de Démarrage de la lecture dans un échantillon JSON via le Service Web Restful...
Voici mon pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework</groupId>
<artifactId>myservice</artifactId>
<version>0.1.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.2.RELEASE</version>
</parent>
<properties>
<java.version>1.7</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-rest-webmvc</artifactId>
</dependency>
<dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>https://repo.spring.io/libs-release</url>
</repository>
<repository>
<id>org.jboss.repository.releases</id>
<name>JBoss Maven Release Repository</name>
<url>https://repository.jboss.org/nexus/content/repositories/releases</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>https://repo.spring.io/libs-release</url>
</pluginRepository>
</pluginRepositories>
</project>
Voici mon code de service web:
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/myservice")
public class BaseService {
@RequestMapping(value="/process", method = RequestMethod.POST)
public void process(@RequestBody String payload) throws Exception {
System.out.println(payload);
}
}
Quand j'invoque l'aide de la commande suivante:
curl -H "Accept: application/json" -H "Content-type: application/json"
-X POST -d '{"name":"value"}' http://localhost:8080/myservice/process
J'obtiens ce message d'erreur:
{"timestamp":1427515733546,"status":400,
"error":"Bad Request",
"exception":
"org.springframework.http.converter.HttpMessageNotReadableException","
message":
"Could not read JSON: Can not deserialize instance of java.lang.String
out of START_OBJECT token\n at
[Source: java.io.PushbackInputStream@8252f; line: 1, column: 1];
nested exception is com.fasterxml.jackson.databind.JsonMappingException:
Can not deserialize instance of java.lang.String out of START_OBJECT token\n
at [Source: java.io.PushbackInputStream@8252f; line: 1, column: 1]",
"path":"/myservice/process"
La seule chose que je suis en train de faire est de passer un JSON valide (comme une chaîne de caractères via curl) et de voir si la Chaîne de charge entre dans le processus de la méthode d' {"name":"valeur"}
Que suis-je bien fais de mal?
Merci d'avoir pris le temps de lire ceci...
- Vous avez une erreur dans votre
pom.xml
: une inutile/unclosed tag<dependency>
avant<dependencies>
. Mais n'est pas votre problème...
Vous devez vous connecter pour publier un commentaire.
Je pense que le plus simple/pratique pour consommer JSON est à l'aide d'une classe Java qui ressemble à votre JSON: https://stackoverflow.com/a/6019761
Mais si vous ne pouvez pas utiliser une classe Java, vous pouvez utiliser l'une de ces deux solutions.
Solution 1: vous pouvez le faire à la réception d'un
Map<String, Object>
à partir de votre contrôleur:À l'aide de votre demande:
Solution 2: sinon, vous pouvez obtenir le POSTE de charge utile en tant que
String
:Ensuite d'analyser la chaîne que vous voulez. Notez que doit être spécifié
consumes = "text/plain"
sur votre contrôleur.Dans ce cas, vous devez modifier votre demande avec
Content-type: text/plain
:Map
objet. Si vous utilisez la deuxième solution sera votre soin de valider et analyser la chaîne JSON, par exemple en utilisant ceci: baeldung.com/jackson-json-to-jsonnodeÀ ajouter sur Andrea solution, si vous êtes de passage à un tableau de JSONs par exemple
Alors vous aurez besoin pour configurer le Printemps Contrôleur de Démarrage comme suit:
Le problème apparaît avec l'analyse du JSON à partir du corps de la requête, typiques pour une invalid JSON. Si vous êtes à l'aide de curl sur windows, essayez d'échapper à l'json comme
-d "{"name":"value"}"
ou même-d "{"""name""":"value"""}"
D'autre part, vous pouvez omettre l'-tête content-type auquel cas whetewer est envoyé sera convertie à votre argument de la Chaîne de
La poursuite des travaux avec l'ensemble des cartes, les points suivants pourraient vous aider: