web-dev-qa-db-fra.com

Statut HTTP 400 - Le paramètre de chaîne requis 'NomPortet' n'est pas présent.

Je travaille avec Java/ Spring MVC RESTful app et récupère 400 HTTP status error lors d'une requête POST. La méthode @RestController est fournie, 

@RequestMapping(value = "/generateAddress", method = RequestMethod.POST)
    public ResponseEntity<WalletInfoWrapper> generateAddress(@RequestParam("walletName") String walletName,
                                                             @RequestParam("currencyName") String currencyName) {

        logger.info("walletName {} and currencyName {}", walletName, currencyName);

        // return if the wallet name or the currency is null
        if (Objects.isNull(walletName) || Objects.isNull(currencyName)) {
            return new ResponseEntity<WalletInfoWrapper>(HttpStatus.NOT_ACCEPTABLE);
        }

        WalletInfo walletInfo = walletService.generateAddress(walletName, currencyName);

        if (Objects.isNull(walletInfo)) {
            return new ResponseEntity<WalletInfoWrapper>(HttpStatus.NOT_ACCEPTABLE);
        }

        WalletInfoWrapper walletInfoWrapper = new WalletInfoWrapper();
        walletInfoWrapper.setName(walletInfo.getName());

        return new ResponseEntity<WalletInfoWrapper>(walletInfoWrapper, HttpStatus.CREATED);
    }

La demande POST dans la Postman fournie ci-dessous, 

 enter image description here

Le message d'erreur informe, Required String parameter 'walletName' is not present

 enter image description here

Je peux également fournir le code des couches services et dataase pour l'observation des opérations de liste déroulante. Quel est le problème ici?

UPDATE

J'ai mis à jour la requête Postman comme ceci et j'ai toujours la même erreur, 

 enter image description here

UPDATE 1

J'ai toujours le même problème, 

Je POST avec les données, 

{"walletName":"puut","currencyName":"Bitcoin"}

Le code est fourni ci-dessous, 

@RequestMapping(value = "/generateAddress", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<WalletInfoWrapper> generateAddress(@RequestBody WalletWithMoneyRequest walletWithMoneyRequest) {

        String walletName = walletWithMoneyRequest.getWalletName();

        String currencyName = walletWithMoneyRequest.getCurrencyName();

        logger.info("walletName {} and currencyName {}", walletName, currencyName);

        // return if the wallet name or the currency is null
        if (Objects.isNull(walletName) || Objects.isNull(currencyName)) {
            return new ResponseEntity<WalletInfoWrapper>(HttpStatus.NOT_ACCEPTABLE);
        }

        WalletInfo walletInfo = walletService.generateAddress(walletName, currencyName);

        if (Objects.isNull(walletInfo)) {
            return new ResponseEntity<WalletInfoWrapper>(HttpStatus.NOT_ACCEPTABLE);
        }

        WalletInfoWrapper walletInfoWrapper = new WalletInfoWrapper();
        walletInfoWrapper.setName(walletInfo.getName());

        return new ResponseEntity<WalletInfoWrapper>(walletInfoWrapper, HttpStatus.CREATED);
    }

La POJO est fournie,

private class WalletWithMoneyRequest {

        String walletName;

        String currencyName;

        public WalletWithMoneyRequest(String walletName, String currencyName) {
            this.walletName = walletName;
            this.currencyName = currencyName;
        }

        public WalletWithMoneyRequest() {
        }

        public String getWalletName() {
            return walletName;
        }

        public String getCurrencyName() {
            return currencyName;
        }

        public void setCurrencyName(String currencyName) {
            this.currencyName = currencyName;
        }

        public void setWalletName(String walletName) {
            this.walletName = walletName;
        }
    }

Ceci est le message d'erreur,

 enter image description here

Voici les informations sur le serveur Tomcat, 

org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver: 08/19/2017 19:45:55 - Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of `mobi.puut.controllers.WalletRestController$WalletWithMoneyRequest` (although at least one Creator exists): can only instantiate non-static inner class by using default, no-argument constructor; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `mobi.puut.controllers.WalletRestController$WalletWithMoneyRequest` (although at least one Creator exists): can only instantiate non-static inner class by using default, no-argument constructor
 at [Source: (PushbackInputStream); line: 1, column: 2]

Tomcat Localhost log

 enter image description here

Tomcat Catalina log enter image description here

4
Arefe

Votre contrôleur attend 2 paramètres de requête qui ressemblent normalement à ceci:/someurl? WalletName = my-wallets-name & currencyName = dollars.

Vous envoyez une chaîne JSON dans le corps du message, mais aucun paramètre formel. Vous devez mettre à jour votre POST ou votre contrôleur pour mettre les deux extrémités en accord. Je pense que vous souhaitez probablement remplacer les deux chaînes annotées @RequestParam par un pojo Java comportant deux membres String: walletName et currencyName, supprimez ce pojo dans votre méthode de requête en tant qu'argument et faites-le précéder de l'annotation @RequestBody. Cela correspondra à votre post json. 

Pour que votre contrôleur accepte la publication avec JSON dans le corps, modifiez-le comme suit:

@RequestMapping(value = "/generateAddress", method = RequestMethod.POST)
public ResponseEntity<WalletInfoWrapper> generateAddress(@RequestBody
    WalletWithMoneyRequest myJsonRequestComingIn) {
    logger.info("walletName {} and currencyName {}", myJsonRequestComingIn.getWalletName(), myJsonRequestComingIn.getCurrencyName());

Et votre pojo

public class WalletWithMoneyRequest{ 

    private String walletName;
    private String currencyName;

    //getters and setters down here. 
2
zerpsed

Modifier

Dans votre demande Postman, au lieu d'envoyer JSON, envoyez les valeurs sous la forme x-www-form-urlencoded.

 enter image description here

2
tima

Pour élaborer sur la réponse de zerpsed.

Changez la signature en:

public ResponseEntity<WalletInfoWrapper> generateAddress(@ResponseBody WalletPOJO walletCurrency)

Où le WalletPOJO a les deux champs walletName et currencyName

1
Kim Rasmussen

Je crois que le problème est résolu pour le moment. J'ai utilisé un POJO comme suggéré avec le paramètre @RequestBody dans la méthode RESTful. Le problème ici est que je dois créer le POJO de la classe (dans le même fichier cependant) et plus tard, le placer dans le répertoire entity en tant qu'entité. 

class WalletWithMoneyRequest {

    String walletName;

    String currencyName;

    public WalletWithMoneyRequest(String walletName, String currencyName) {
        this.walletName = walletName;
        this.currencyName = currencyName;
    }

    public WalletWithMoneyRequest() {
    }

    public String getWalletName() {
        return walletName;
    }

    public String getCurrencyName() {
        return currencyName;
    }

    public void setCurrencyName(String currencyName) {
        this.currencyName = currencyName;
    }

    public void setWalletName(String walletName) {
        this.walletName = walletName;
    }
}

Le problème principal est de croire qu’il s’agissait d’une erreur dans la variable HQL

 enter image description here

J'ai écrit currency =: currency où il devrait être currency = :currency

Je ne peux toujours pas avoir les données dans la base de données car je devrai modifier la méthode dans la couche database

1
Arefe