我在Glassfish 3.0.1上使用multipart / formdata参数有一个REST Web服务。由于性能低下,我已将服务器升级到3.1。我正在使用Jersey,因此我在Webservice项目中有适当的web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>RestWSGS</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>ws</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/jersey/*</url-pattern>
</servlet-mapping>
</web-app>
我已向网络服务发出了ajax请求。 html代码是:
var formdata = new FormData();
formdata.append("connecturi","jdbc:mysql://localhost/schema1");
formdata.append("username","root");
formdata.append("password","metamagics");
$.ajax(
{
url: 'http://comp1:8080/RestWSGS/jersey/GetSchemaTable',
async: false,
data: formdata,
type: 'POST',
cache: false,
dataType: 'text',
contentType: "multipart/form-data",
processData: false,
success: function(data)
{
dbtb = data;
}
});
在升级Web服务器之前和之后,请求完美无缺,我得到的响应是400 - Bad Request。 除了将@FormParam更改为@FormDataParam之外,我没有在升级后进行任何代码更改(因为在升级到使用jdk 7的glassfish 3.1之后我得到了一个弃用的错误)。
如果有人知道为什么会这样,请告诉我。 提前谢谢!
编辑: 使用@FormParam代替通过完美的请求。因此,当@FormParam更改为@FormDataParam时,我为请求中断创建的jersey和FormData对象之间的某些链接。是否有解决方法???
我在球衣中启用了日志记录和跟踪。这是我的输出:
INFO: 6 * Server in-bound request
6 > POST http://comp1:8080/RestWSGS/jersey/GetJson
6 > host: comp1:8080
6 > user-agent: Mozilla/5.0 (Windows NT 5.1; rv:8.0) Gecko/20100101 Firefox/8.0
6 > accept: application/json, text/javascript, */*
6 > accept-language: en-us
6 > accept-encoding: gzip, deflate
6 > accept-charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
6 > connection: keep-alive
6 > content-type: multipart/form-data
6 > x-requested-with: XMLHttpRequest
6 > referer: http://comp1:8080/GUIForGS/gridsense/fileSelection.html
6 > content-length: 621
6 > pragma: no-cache
6 > cache-control: no-cache
6 >
-----------------------------187161971819895
Content-Disposition: form-data; name="purpose"
new
-----------------------------187161971819895
Content-Disposition: form-data; name="filename"
BoilerHeater_BQPRJun09.xls
-----------------------------187161971819895
Content-Disposition: form-data; name="username"
abcd#7 11 2011 12 24 23
-----------------------------187161971819895
Content-Disposition: form-data; name="password"
abcd#7 11 2011 12 24 23
-----------------------------187161971819895
Content-Disposition: form-data; name="company"
Third
-----------------------------187161971819895--
INFO: 6 * Server out-bound response
6 < 400
6 < X-Jersey-Trace-000: accept root resource classes: "/GetJson"
6 < X-Jersey-Trace-001: match path "/GetJson" -> "/application\.wadl(/.*)?", "/WriteIntoFiles(/.*)?", "/GetSchemaTable(/.*)?", "/ExcelHtmlTable(/.*)?", "/UploadFiles(/.*)?", "/UpdateDB(/.*)?", "/GetTable(/.*)?", "/GetJson(/.*)?"
6 < X-Jersey-Trace-002: accept right hand path java.util.regex.Matcher[pattern=/GetJson(/.*)? region=0,8 lastmatch=/GetJson]: "/GetJson" -> "/GetJson" : ""
6 < X-Jersey-Trace-003: accept resource: "GetJson" -> @Path("/GetJson") ws.GetJson@18a76d6
6 < X-Jersey-Trace-004: match path "" -> ""
6 < X-Jersey-Trace-005: accept resource methods: "GetJson", POST -> ws.GetJson@18a76d6
6 < X-Jersey-Trace-006: matched resource method: public spreadsheet.Exceldatalist ws.GetJson.getJson(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)
6 < X-Jersey-Trace-007: matched message body reader: class com.sun.jersey.multipart.FormDataMultiPart, "multipart/form-data" -> com.sun.jersey.multipart.impl.MultiPartReaderServerSide@a74cfe
6 < X-Jersey-Trace-008: mapped exception to response: javax.ws.rs.WebApplicationException@19b218 -> 400 (Bad Request)
6 <
没有例外,没有办法找出问题所在。我该怎么办?如果Glassfish 3.1包含泽西多部分jar,那么多部分请求不起作用的原因是什么?
请帮我解决这个问题
答案 0 :(得分:0)
我找到了一个解决方案,可能不是很优雅但是符合我的目的。
我更改了@comsumes mediatype以形成url编码。在客户端html中创建了一个表单标记,并将其发布到Web服务。 Ajax调用将dataType作为应用程序// x-www-form-urlencoded。现在@formParam从客户端获取正确的值。
在此之前,我尝试了很多变化: - 将@FormParam更改为@FormDataParam然后添加了FormContentDisposition部分,但无济于事!在这里没有找到球衣论坛的解决方案。所以不得不继续这个解决方案。 如果有人找到,请使用适当的解决方案进行更新。
卡维塔