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,
Le message d'erreur informe, Required String parameter 'walletName' is not present
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,
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,
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
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.
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
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
.
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
.