2013-05-13 5 views
6

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.

risposta

6

rimuovere quelle setRequestHeader

var form = document.getElementById('form'); 
var formdata = new FormData(form); 

var xmlhttp=new XMLHttpRequest(); 
    } 
xmlhttp.onreadystatechange=function() 
    { 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
     document.getElementById("xmlTextBox").innerHTML=xmlhttp.responseText; 
    } 
    } 
xmlhttp.open("POST", "PostXml", true); 
xmlhttp.send(formdata); 

http://jsfiddle.net/8NWB7/ lavoro
http://jsfiddle.net/8NWB7/1/ non funziona

+0

Wow, sono certo Ho iniziato senza quelle intestazioni di richiesta ?! Probabilmente ho cambiato qualcos'altro allo stesso tempo. Molte grazie! – thomascrabs

+0

@thomascrabs sei il benvenuto. – Musa

+1

@Musa Sto lavorando con Android. La tua soluzione ha funzionato anche per me. Puoi dirmi qual è la ragione di questo? –