Dans mon application Spring Boot, je dois transmettre la valeur String avec MultipartFile en tant que Requestparam
.
Controller se trouve en dessous de l'endroit où je convertis MultipartFile en java.io.File
, puis je le transmets au contrôleur DAO à l'aide de restTemplate
.
La requête d'Angular frappera d'abord Upload Controller puis UploadController est client (Java) et il appellera le serveur svs-ba-dao Controller avec URL de base.
csvUpload
contient l'URL de base: http: // localhost: 8082 / svs-ba-dao / csvUpload? parentPkId = & file = multipartFile
Converted File Name is -->testInput_TxnMpMotSlv.csv 2019-01-24T15:12:41,217 ERROR [[localhost].[/svs-ba-dao].[dispatcherServlet]] [http-nio-8085-exec-2] Servlet.service() for servlet [dispatcherServlet] in context with path [/svs-ba-dao] threw exception [Request processing failed; nested exception is org.springframework.web.client.HttpServerErrorException: 500 null] with root cause org.springframework.web.client.HttpServerErrorException: 500 null at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:97) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:79) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:766) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:724) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:680) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE] at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:600) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE] at com.svs-ba-dao.controller.UploadController.csvUpload(UploadController.java:59) ~[classes/:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_192] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_192] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_192] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_192]
Dans svs-ba-dao Controller, l'attrape comme ci-dessous
@RequestMapping(value="/csvUpload", method=RequestMethod.POST) public String csvUpload(@RequestParam String parentPkId, @RequestParam MultipartFile file) throws IOException { log.info("Entered method csvUpload() of svs-ba-dao.class"); return uploadService.csvUpload(parentPkId,file); }
J'ai inclus ces propriétés dans le fichier application.properties de mon application:
spring.servlet.multipart.maxFileSize = 1 Mo spring.servlet.multipart.maxRequestSize = 1 Mo
Je lance donc mon application et j'appelle le / csvUpload
qui générer la requête POST.
Je reçois une erreur ci-dessous.
@CrossOrigin @RestController public class UploadController { private static final Logger log = LogManager.getLogger(UploadController.class); @Value("${salama.dao.csvUpload.rest.url}") private String csvUpload; @Autowired UploadHelperService uploadHelperService; @PostMapping(value = "/csvUpload") public String csvUpload(@QueryParam("parentPkId") String parentPkId, @RequestParam("file") MultipartFile file ) throws IllegalStateException, IOException{ log.info("Calling csvUpload :" + csvUpload); final HttpHeaders requestHeaders = new HttpHeaders(); requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA); File cnvFile = uploadHelperService.multipartToFile(file,file.getOriginalFilename()); System.out.println("Converted File Name is -->"+cnvFile.getName()); final MultiValueMap<String, Object> data = new LinkedMultiValueMap<>(); data.add("parentPkId", parentPkId); data.add("file", new FileSystemResource(cnvFile)); HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(data, requestHeaders); RestTemplate restTemplate = new RestTemplate(); ResponseEntity<String> obj =restTemplate.exchange(csvUpload, HttpMethod.POST, requestEntity, String.class); return obj.getBody(); } }
L'erreur est dans resttemplate car elle prend null, mais la manière syntaxique d'appeler RestTemplate est correcte car je n'obtiens aucune erreur. est-ce que j'appelle correctement l ' URL de base ? en transmettant les valeurs de
requestparam
. c'est à dire parentPkId =? & file = multipartFile
http: // localhost: 8082 / svs-ba-dao / csvUpload? parentPkId = & file = multipartFile
honnêtement, je n'ai jamais travaillé là-dessus.
Là où je me trompe, toutes pistes ou corrections sont les bienvenues. Merci d'avance
3 Réponses :
Il n'y a aucun problème pour appeler. Regardez attentivement votre erreur de trace de pile. Dans la méthode csvUpload, vous imprimez ceci:
at com.svs-ba-dao.controller.UploadController.csvUpload(UploadController.java:59)
cette ligne imprimée dans le journal:
Converted File Name is -->testInput_TxnMpMotSlv.csv
L'appel était donc correct. problème ici:
System.out.println("Converted File Name is -->"+cnvFile.getName());
Il suffit de vérifier à la ligne numéro 59 dans la méthode csvUpload de UploadController strong >. vous trouverez votre erreur.
Regardez ceci . comment appeler multipart en utilisant modèle de repos.
ResponseEntity
c'est la ligne où j'obtiens une erreur. mais je ne pouvais pas creuser la cause racine car syntaxiquement son @sajib correct
Vous pouvez faire plusieurs choses pour comprendre ce qui se passe réellement:
Essayez d'appeler votre point de terminaison pour csvUpload dans svs-ba-dao Controller
depuis Postman pour voir s'il fonctionne indépendamment. Mettez également à jour votre méthode csvUpload en
@RequestMapping (value = "/ csvUpload", method = RequestMethod.POST)
public String csvUpload (@RequestParam ("parentPkId") String parentPkId,
@RequestParam ("file") MultipartFile file) lève IOException {
log.info ("Méthode entrée csvUpload () de svs-ba-dao.class");
return uploadService.csvUpload (parentPkId, fichier);
}
Entourez votre appel RestTemplate de try-catch
ResponseEntity
afin de voir une exception qui provient du svs-ba-dao Controller
.
J'ai essayé d'appeler svs-ba-dao Controller
qui fonctionne très bien indépendamment. mais le problème est quand j'ai essayé de l'appeler depuis ** UploadController
**.
pouvez-vous vérifier en ajoutant headers = "content-type = multipart / form-data"
dans le svs-ba-dao Controller
?
Ici, j'ai trouvé où je m'étais trompé
csvUpload contiendra l'URL qui doit être transmise dans le modèle de repos
@Value("${salama.dao.csvUpload.rest.url}") private String csvUpload;
J'ai trouvé cette URL de base: c'est-à-dire csvUpload
http: // localhost: 8082 / svs-ba-dao / csvUpload? parentPkId = & file = multipartFile
l'envoi depuis UploadController était incorrect.
Pas besoin de spécifier quoi que ce soit comme multipartFile
pour mediaType
dans l'URL. il reprendra automatiquement.
mais pour certaines URL, il est nécessaire de spécifier ? mediaType = json
si vous envoyez un objet JSON.
Voici mon URL de base mise à jour: http : // localhost: 8082 / svs-ba-dao / csvUpload? parentPkId = & file =
entourez votre appel RestTemplate avec try catch et sysout obj.getBody (), voyez quelle exception a été déclenchée!