HTTP État 400 - Requis paramètre de Chaîne 'walletName' n'est pas présent
Je travaille avec Java/Spring MVC RESTful
app et obtenir 400 HTTP status error
tout en faisant un POST
demande. Le @RestController
méthode 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 POST
demande dans le Postman
fourni ci-dessous,
Le message d'erreur informe, Required String parameter 'walletName' is not present
Je peux également fournir le code pour le services
et la dataase
couches pour l'observation de la liste déroulante des opérations. Quel est le problème ici?
UPDATE
J'ai mis à jour le Postman
demande de ce genre et ayant toujours le même message d'erreur,
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 fourni,
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;
}
}
C'est le message d'erreur,
Ici ia le serveur Tomcat info,
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
Tomcat Catalina log
- Il semble que vous êtes l'envoi d'une chaîne JSON comme paramètre, mais ce n'est pas ce que votre contrôleur attend. Ou est-ce juste la façon dont il regarde en Facteur?
- Comment faire le contrôleur de comprendre?
- Remarque: Reposant demandes acceptent généralement des paramètres GET ou POST et retour JSON.
- le
@ResponseBody
est implicite sur les méthodes de@RestController
annoté classes. J'étais pas au courant de la@RequestBody
implicite de l'annotation. - avez-vous de la sortie de la console de votre serveur ou un journal qui pourrait indiquer pourquoi votre serveur n'aime pas votre demande?
- Oui, j'ai un message, un coup d'oeil dans la mise à jour du post
- Vu la sortie. Bon. Essayez de faire de votre classe WalletWithMoneyRequest publique au lieu de privé.
- Rendant
public
n'aide pas et encore je obtenir de l'HTTP status of 400
. Mais je pense que nous avons cerné le problème avec le message d'erreur fourni dans la question. - Faire WalletWithMoneyRequest ses propres extérieur de la classe. Jackson semble être plus difficile à utiliser lors de marshaling json à l'intérieur de la classe. voir: stackoverflow.com/questions/17289964/... . C'est aussi intéressant à lire: cowtowncoder.com/blog/archives/2010/08/entry_411.html copié à partir lié réponse.
Vous devez vous connecter pour publier un commentaire.
Votre contrôleur attend 2 paramètres de la requête que normalement ressembler à ceci: /someurl?walletName=mon-portefeuilles-nom¤cyName=dollars.
Vous envoyez une chaîne json dans le corps post, mais pas de paramètres formels. Vous avez besoin de mettre à jour votre POSTE ou de votre contrôleur pour que les deux extrémités d'accord. Je pense que vous voulez probablement pour remplacer les deux @RequestParam annoté Cordes, avec un pojo Java qui a Chaîne de deux membres: walletName et currencyName, déposer le pojo dans votre méthode de demande en tant qu'argument et de la faire précéder de l'annotation @RequestBody. Cela va correspondre à votre json post.
Avoir votre contrôleur accepter le poste avec JSON dans le corps de le modifier comme ceci:
Et votre pojo
(update either the POST, or the controller)
à l'exécution de l'opération correctement.Modifier
Dans votre Facteur demande, au lieu de les envoyer JSON, envoyer les valeurs que
x-www-form-urlencoded
.x-www-form-urlencoded
il va envoyer les paramètres dans l'URL comme @zerpsed mentionnéD'élaborer sur zerpsed de réponse.
Modifier la signature à:
Où la WalletPOJO a les deux champs walletName et currencyName
Je crois que le problème est résolu pour l'instant. J'ai utilisé un
POJO
comme l'a suggéré avec le@RequestBody
paramètre dans laRESTful
méthode. Le piège ici est j'ai besoin de faire lePOJO
hors de la classe (dans le même fichier), et plus tard, le mettre dans le répertoire entity comme une entité.La question principale est de croire a une erreur dans le
HQL
,J'ai écrit
currency =: currency
où il devrait êtrecurrency = :currency
Je ne peux toujours pas les données dans la base de données que j'ai besoin de modifier la méthode dans le
database
couche.