2013-05-13 29 views
6

Tôi đang cố gắng đăng một số dữ liệu biểu mẫu bằng cách sử dụng javascript đối với Tài nguyên Jersey. Đây là javascript:Mẫu đơn đăng với 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); 

Các Jersey Resource trông như thế này:

@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"; 

} 

Phiên bản thực bao gồm nhiều params và mã đầy đủ, nhưng các chú thích đều giống nhau. Điều này tạo ra ngoại lệ sau khi chạy qua 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) 

Từ nhìn vào nguồn sản sinh ra ngoại lệ có vẻ như các param không đến qua:

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; đã sử dụng firebug để đặt một dấu vết trên và tên/giá trị đang đến thông qua một cách khác nhau khi sử dụng javascript so với một bài viết HTML thẳng. Trong dấu vết cho bài đăng HTML, loại nội dung được trả lại trong luồng tải lên:

Request Headers From Upload Stream 
Content-Length 1756 
Content-Type multipart/form-data; boundary=---------------------------1523409566516443041527622966 

Nhưng javascript dường như chỉ là một bài đăng chuẩn hoặc một thứ gì đó? Bất kỳ ý tưởng làm thế nào tôi sao chép bài multiformdata trong javascript ??

Bất kỳ ý tưởng nào giống như tôi đang truyền tải thông qua OK? Tôi cũng đã thử điều này bằng cách sử dụng một bài đăng dạng HTML bình thường và nó hoạt động tốt, vì vậy phải có liên quan đến javascript.

Trả lời

6

Di chuyển những 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/ làm việc
http://jsfiddle.net/8NWB7/1/ không làm việc

+0

Wow, tôi chắc chắn tôi bắt đầu mà không có những tiêu đề yêu cầu ?! Tôi có lẽ đã thay đổi một cái gì đó khác cùng một lúc. Cảm ơn rất nhiều! – thomascrabs

+0

@thomascrabs bạn được chào đón. – Musa

+1

@Musa Tôi đang làm việc với Android. Giải pháp của bạn cũng làm việc cho tôi. Bạn có thể cho tôi biết lý do của việc này là gì? –

Các vấn đề liên quan