6
votes

MultipartFile + String en tant que paramètre de demande à l'aide de RestTemplate au printemps

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


1 commentaires

entourez votre appel RestTemplate avec try catch et sysout obj.getBody (), voyez quelle exception a été déclenchée!


3 Réponses :


1
votes

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.


1 commentaires

ResponseEntity obj = restTemplate.exchange (csvUpload, HttpMethod.POST, requestEntity, String.class); c'est la ligne où j'obtiens une erreur. mais je ne pouvais pas creuser la cause racine car syntaxiquement son @sajib correct



1
votes

Vous pouvez faire plusieurs choses pour comprendre ce qui se passe réellement:

  1. 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); }

  2. Entourez votre appel RestTemplate de try-catch

    ResponseEntity obj = restTemplate.exchange (csvUpload, HttpMethod.POST, requestEntity, String.class);

afin de voir une exception qui provient du svs-ba-dao Controller .


2 commentaires

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 ?



2
votes

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 =


0 commentaires