обновление glassfish 3.0.1 до 3.1 дает плохой запрос на REST ws - PullRequest
1 голос
/ 06 декабря 2011

У меня есть веб-сервис REST, использующий параметры multipart / formdata на Glassfish 3.0.1. Из-за низкой производительности я обновил сервер до 3.1. Я использую Джерси и для этого у меня есть соответствующий файл web.xml в моем проекте Webservice:

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

Запрос работал без сбоев до и после обновления веб-сервера, и я получаю ответ 400 - Bad Request. Я не вносил никаких изменений в код после обновления, за исключением изменения @FormParam на @FormDataParam (так как я получил устаревшую ошибку после обновления до glassfish 3.1, который использует jdk 7).

В случае, если кто-нибудь знает, почему это происходит, пожалуйста, дайте мне знать. Заранее спасибо!

EDIT: Использование @FormParam вместо этого позволяет безупречно выполнить запрос. Так что некоторая связь между трикотажем и объектом FormData, который я создаю для разрыва запроса, когда @FormParam изменяется на @FormDataParam. Есть ли обходной путь для этого ???

Я включил ведение журнала и трассировку в Джерси. Это мой вывод:

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 включает в себя jarsey multipart jar, по какой причине не работает multipart запрос?

Пожалуйста, помогите мне с этим

1 Ответ

0 голосов
/ 03 января 2012

Я нашел для этого решение, которое может быть не элегантным, но служит моей цели.

Я изменил тип @comsumes для формирования закодированного URL-адреса.Создал тег формы в клиентском html и разместил его в веб-сервисе.Ajax-вызов имеет dataType в качестве приложения // x-www-form-urlencoded.Теперь @formParam получает правильные значения от клиента.

До этого я опробовал множество вариантов: - изменил @FormParam на @FormDataParam, затем добавил часть FormContentDisposition, но безрезультатно!не нашел решения на форуме Джерси ни здесь.Поэтому пришлось двигаться дальше с этим решением.Пожалуйста, обновите с правильным решением на случай, если кто-нибудь найдет его.

Kavita

...