【问题标题】:Javascript Form Post with Jersey MultiFormData - Null Pointer Exception带有 Jersey MultiFormData 的 Javascript 表单发布 - 空指针异常
【发布时间】:2013-05-14 06:02:30
【问题描述】:

我正在尝试使用 javascript 针对 Jersey 资源发布一些表单数据。这是javascript:

            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);

泽西资源如下所示:

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

}

真正的版本包含更多的参数和完整的代码,但注解是一样的。这在通过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)

通过查看产生异常的源,看起来参数没有通过:

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     }

我已使用 firebug 进行跟踪,与直接使用 HTML 帖子相比,使用 javascript 时名称/值的传递方式不同。在 HTML 帖子的跟踪中,内容类型在上传流中返回:

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

但是 javascript 似乎只是一个标准的帖子或什么的?任何想法如何在 javascript 中复制 multiformdata 帖子??

任何想法,因为看起来我正在通过 OK?我也尝试过使用普通的 HTML 表单帖子,它工作正常,所以必须与 javascript 相关。

【问题讨论】:

    标签: javascript post jersey


    【解决方案1】:

    删除那些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/ 工作
    http://jsfiddle.net/8NWB7/1/ 不工作

    【讨论】:

    • 哇,我确定我开始时没有那些请求标头?!我可能同时改变了其他东西。非常感谢!
    • @Musa 我正在使用 Android。您的解决方案也对我有用。你能告诉我这是什么原因吗?
    • @IshanKhanna 在原始帖子中的内容类型设置不正确,mutipart-formdata 需要一个边界。即使您设置了边界,用户代理也会使用您设置的边界(我不知道,但我对此表示怀疑)。但是,当您将 FormData 对象传递给 XMLHttpRequest.send 时,它会为您设置正确的内容类型和边界。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多