web-dev-qa-db-fra.com

Printemps mvc mauvaise demande avec @requestbody

j'ai un service Spring MVC avec cette signature:

@RequestMapping(method = RequestMethod.POST, value = "/addUser", consumes = "application/json")
    public @ResponseBody User addUser(@RequestBody User user) {

Et cela dans context.xml

<bean id="jacksonMessageConverter"
        class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
    <bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="jacksonMessageConverter" />
            </list>
        </property>
    </bean>

Je fais une demande de poste et me retourne toujours une demande de 400errors -> Bad. J'écris un filtre pour lire le contenu de la requête et ceci est:

Modifier json:

{
    "email": "Anchor",
    "latitude": 40.3139461,
    "longitude": -3.8810229,
    "name": "a",
    "online": true,
    "password": "a",
    "deviceRegId": "APA91bGnD1EuqEm9cpoHsenC-HEphQJRniEnhPovK24QkKkLBXrDesSCP6CFlyOKwR1huwSI28Wd-DdN0N8MDKle7myYB7Dznzc3Z11ZOv3jMlJEIegykpnnnYScrElw2czQEa4pKFeQW7BklUsUS-IB15LMqH_Ag"
}

Edit: La classe d'utilisateurs

public class User implements Serializable{


@JsonProperty("deviceRegId")
private Java.lang.String deviceRegistrationID;
@JsonProperty("email")
private Java.lang.String email;
@JsonProperty("latitude")
private Java.lang.Double latitude;
@JsonProperty("longitude")
private Java.lang.Double longitude;
@JsonProperty("name")
private Java.lang.String name;
@JsonProperty("online")
private Java.lang.Boolean online;
@JsonProperty("password")
private Java.lang.String password;

public User(String deviceRegid) {
    this.deviceRegistrationID = deviceRegid;
    this.online = true;
}

public Java.lang.String getDeviceRegistrationID() {
    return deviceRegistrationID;
}

public Java.lang.String getEmail() {
    return email;
}

public void setEmail(Java.lang.String email) {
    this.email = email;
}

public Java.lang.Double getLatitude() {
    return latitude;
}

public void setLatitude(Java.lang.Double latitude) {
    this.latitude = latitude;
}

public Java.lang.Double getLongitude() {
    return longitude;
}

public void setLongitude(Java.lang.Double longitude) {
    this.longitude = longitude;
}

public Java.lang.String getName() {
    return name;
}

public void setName(Java.lang.String name) {
    this.name = name;
}

public Java.lang.Boolean getOnline() {
    return online;
}

public void setOnline(Java.lang.Boolean online) {
    this.online = online;
}

/**
 * @return value or {@code null} for none
 */
public Java.lang.String getPassword() {
    return password;
}

/**
 * @param password
 *            password or {@code null} for none
 */
public void setPassword(Java.lang.String password) {
    this.password = password;
}

Quel est le problème?

9
colymore

S'il vous plaît supprimer le constructeur paramétrée et voilà. :)

public User(String deviceRegid) {
  this.deviceRegistrationID = deviceRegid;
  this.online = true;
}

Parce que, à la liaison de données, le constructeur par défaut est appelé.

Vérifiez vos données JSON:

{
  "email": "Anchor",
  "latitude": 40.3139461,
  "longitude": -3.8810229,
  "name": "a",
  "online": true,
  "password": "a",
   "deviceRegId": "APA91bGnD1EuqEm9cpoHsenC-HEphQJRniEnhPovK24QkKkLBXrDesSCP6CFlyOKwR1huwSI28Wd-DdN0N8MDKle7myYB7Dznzc3Z11ZOv3jMlJEIegykpnnnYScrElw2czQEa4pKFeQW7BklUsUS-IB15LMqH_Ag"
}

Vérifiez les choses suivantes:

  1. Si le nom de JSON correspond au nom du champ de la classe User .
  2. Vérifiez également si JSON value est pris en charge par le nom de champ correspondant datatype in User class.

    Essayez-le, j'ai fait face au même problème plusieurs fois.

24
Touchstone

J'ai eu une mauvaise demande aussi. Et parfois une mauvaise syntaxe, etc. Mais je l'ai corrigé avec une autre dépendance de Jackson:

Au lieu de Codehause Jackson, j'utilise maintenant plus rapidexml:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.3.3</version>
</dependency>
0
Eruvanos

J'allais deviner que le problème venait de consumes = "application/json", et peut-être que c'est ... mais j'ai fait un test rapide en ajoutant cette restriction à mon environnement (qui ne spécifie pas qu'il envoie "application/json")

et à la place, j'ai obtenu un "Type de support 415 non pris en charge".

Néanmoins, je recommande de supprimer cela et voir si cela aide.

0
Brian T.