Sto provando a pubblicare alcuni dati di modulo usando javascript contro una risorsa di Jersey. Ecco il javascript:Modulo di javascript con Jersey MultiFormData - Null Pointer Exception
var form = document.getElementById('form');
var formdata = new FormData(form);
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("xmlTextBox").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("POST", "PostXml", true);
xmlhttp.setRequestHeader('Content-Type', 'multipart/form-data');
xmlhttp.setRequestHeader("Content-length", formdata.length);
xmlhttp.setRequestHeader("Connection", "close");
xmlhttp.send(formdata);
The Jersey Resource simile a questa:
@Path("/Resource")
public class MyClass {
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.TEXT_XML)
public String postXML(@FormDataParam("param1") String param1,
@FormDataParam("param2") String param2){
return "test";
}
La versione reale include più params e il codice completo, ma le annotazioni sono gli stessi. Questo produce il seguente eccezione quando si esegue attraverso Tomcat:
java.lang.NullPointerException
at com.sun.jersey.multipart.impl.MultiPartReaderClientSide.unquoteMediaTypeParameters(MultiPartReaderClientSide.java:227)
at com.sun.jersey.multipart.impl.MultiPartReaderClientSide.readMultiPart(MultiPartReaderClientSide.java:154)
at com.sun.jersey.multipart.impl.MultiPartReaderServerSide.readMultiPart(MultiPartReaderServerSide.java:80)
at com.sun.jersey.multipart.impl.MultiPartReaderClientSide.readFrom(MultiPartReaderClientSide.java:144)
at com.sun.jersey.multipart.impl.MultiPartReaderClientSide.readFrom(MultiPartReaderClientSide.java:82)
at com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:488)
at com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:552)
Guardando la fonte che ha prodotto l'eccezione sembra che il parametro non è venuta attraverso:
224 for (final String parameterName : parameters) {
225 String parameterValue = mediaType.getParameters().get(parameterName);
226
227 if (parameterValue.startsWith("\"")) {
228 parameterValue = parameterValue.substring(1, parameterValue.length() - 1);
229 unquotedParams.put(parameterName, parameterValue);
230 }
231 }
I; ho usato Firebug per metti una traccia e il nome/i valori stanno entrando in modo diverso quando usi javascript rispetto a un post HTML dritto. Nella traccia per il codice HTML pubblicare il tipo di contenuto viene restituito in un flusso di upload:
Request Headers From Upload Stream
Content-Length 1756
Content-Type multipart/form-data; boundary=---------------------------1523409566516443041527622966
Ma il JavaScript sembra essere solo un palo standard o qualcosa del genere? Qualche idea su come replicare il post multiformato in javascript ??
Qualche idea in quanto sembra che sto passando le cose attraverso OK? Ho anche provato questo utilizzando un normale modulo HTML post e funziona bene, quindi deve essere correlato al javascript.
Wow, sono certo Ho iniziato senza quelle intestazioni di richiesta ?! Probabilmente ho cambiato qualcos'altro allo stesso tempo. Molte grazie! – thomascrabs
@thomascrabs sei il benvenuto. – Musa
@Musa Sto lavorando con Android. La tua soluzione ha funzionato anche per me. Puoi dirmi qual è la ragione di questo? –