json - que - spring rest ejemplo
Solicitud de mĂșltiples partes de Spring MVC con JSON (3)
Quiero publicar un archivo con algunos datos JSON usando Spring MVC. Así que he desarrollado un servicio de descanso como
@RequestMapping(value = "/servicegenerator/wsdl", method = RequestMethod.POST,consumes = { "multipart/mixed", "multipart/form-data" })
@ResponseBody
public String generateWSDLService(@RequestPart("meta-data") WSDLInfo wsdlInfo,@RequestPart("file") MultipartFile file) throws WSDLException, IOException,
JAXBException, ParserConfigurationException, SAXException, TransformerException {
return handleWSDL(wsdlInfo,file);
}
Cuando envío una solicitud del cliente de reposo con content-Type = multipart/form-data or multipart/mixed
, obtengo la siguiente excepción: org.springframework.web.multipart.support.MissingServletRequestPartException
¿Alguien puede ayudarme a resolver este problema?
¿Puedo usar @RequestPart
para enviar tanto Multipart como JSON a un servidor?
Así es como implementé Spring MVC Multipart Request con JSON Data.
Solicitud de múltiples partes con datos JSON (también llamado Mixed Multipart):
En base al servicio RESTful en la versión Spring 4.0.2, la solicitud HTTP con la primera parte como datos formateados XML o JSON y la segunda parte como un archivo se puede lograr con @RequestPart. A continuación se muestra la implementación de la muestra.
Fragmento de Java:
El servicio de reposo en Controller habrá mezclado @RequestPart y MultipartFile para servir dicha solicitud Multipart + JSON.
@RequestMapping(value = "/executesampleservice", method = RequestMethod.POST,
consumes = {"multipart/form-data"})
@ResponseBody
public boolean executeSampleService(
@RequestPart("properties") @Valid ConnectionProperties properties,
@RequestPart("file") @Valid @NotNull @NotBlank MultipartFile file) {
return projectService.executeSampleService(properties, file);
}
Fragmento del front-end (JavaScript):
Crea un objeto FormData.
Agregue el archivo al objeto FormData usando uno de los pasos a continuación.
- Si el archivo se ha cargado utilizando un elemento de entrada de tipo "archivo", añádalo al objeto FormData.
formData.append("file", document.forms[formName].file.files[0]);
- Agregue directamente el archivo al objeto FormData.
formData.append("file", myFile, "myfile.txt");
OformData.append("file", myBob, "myfile.txt");
- Si el archivo se ha cargado utilizando un elemento de entrada de tipo "archivo", añádalo al objeto FormData.
Crea un blob con los datos JSON codificados y añádelo al objeto FormData. Esto hace que el tipo de contenido de la segunda parte en la solicitud multiparte sea "aplicación / json" en lugar del tipo de archivo.
Envía la solicitud al servidor.
Pedir detalles:
Content-Type: undefined
. Esto hace que el navegador establezca Content-Type en multipart / form-data y complete el límite correctamente. La configuración manual de Content-Type a multipart / form-data no completará el parámetro de límite de la solicitud.
Código Javascript:
formData = new FormData();
formData.append("file", document.forms[formName].file.files[0]);
formData.append(''properties'', new Blob([JSON.stringify({
"name": "root",
"password": "root"
})], {
type: "application/json"
}));
Pedir detalles:
method: "POST",
headers: {
"Content-Type": undefined
},
data: formData
Solicitud de carga útil:
Accept:application/json, text/plain, */*
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryEBoJzS3HQ4PgE1QB
------WebKitFormBoundaryvijcWI2ZrZQ8xEBN
Content-Disposition: form-data; name="file"; filename="myfile.txt"
Content-Type: application/txt
------WebKitFormBoundaryvijcWI2ZrZQ8xEBN
Content-Disposition: form-data; name="properties"; filename="blob"
Content-Type: application/json
------WebKitFormBoundaryvijcWI2ZrZQ8xEBN--
Como dice la documentación:
Se genera cuando no se puede encontrar la parte de una solicitud "multipart / form-data" identificada por su nombre.
Esto puede deberse a que la solicitud no es un multipart / form-data porque la parte no está presente en la solicitud o porque la aplicación web no está configurada correctamente para procesar solicitudes de varias partes, por ejemplo, no MultipartResolver.
Esto debe funcionar!
cliente (angular):
$scope.saveForm = function () {
var formData = new FormData();
var file = $scope.myFile;
var json = $scope.myJson;
formData.append("file", file);
formData.append("ad",JSON.stringify(json));//important: convert to JSON!
var req = {
url: ''/upload'',
method: ''POST'',
headers: {''Content-Type'': undefined},
data: formData,
transformRequest: function (data, headersGetterFunction) {
return data;
}
};
Arranque Backend-Spring:
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public @ResponseBody
Advertisement storeAd(@RequestPart("ad") String adString, @RequestPart("file") MultipartFile file) throws IOException {
Advertisement jsonAd = new ObjectMapper().readValue(adString, Advertisement.class);
//do whatever you want with your file and jsonAd