簡體   English   中英

向Jersey多部分表單數據功能添加注釋會破壞它

[英]Adding annotations to a Jersey multipart-form-data function breaks it

我有Tomcat Jersey服務,該服務應該與其他參數一起接受文件。 以下代碼說明了用例:

    @POST
    @Path("/fileupload")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public void post(@FormDataParam("file")File file, @FormDataParam("fileType")String fileType) throws FileNotFoundException
    {
//Your local disk path where you want to store the file
        String uploadedFileLocation = "C://AlienTemp/" + file.getName();
        System.out.println(uploadedFileLocation);
        System.out.println(fileType);
        // save it
        File objFile=new File(uploadedFileLocation);
        if(objFile.exists())
        {
            objFile.delete();
        }

        saveToFile(new FileInputStream(file), uploadedFileLocation);
    }

    private void saveToFile(InputStream uploadedInputStream,
                            String uploadedFileLocation) {
        try {
            OutputStream out = null;
            int read = 0;
            byte[] bytes = new byte[1024];

            out = new FileOutputStream(new File(uploadedFileLocation));
            while ((read = uploadedInputStream.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }
            out.flush();
            out.close();
        } catch (IOException e) {

            e.printStackTrace();
        }
    }

僅當我刪除fileType參數和所有注釋時,上傳本身才有效。 如果存在任何注釋,則該注釋不起作用。 Tomcat拋出一個無用的400錯誤:“客戶端發送的請求在語法上不正確。”。 如果我沒有指定任何注釋,那么servlet不會啟動,並拋出資源錯誤。

換句話說,僅當存在一個沒有注釋的參數(文件)時,上傳請求才會成功。

其他詳情:

  • Tomcat:嵌入式8.0.21
  • 球衣:2.22.1
  • 客戶端:Chrome中的Postman應用
  • 爪哇:1.8

為什么注釋不起作用?

編輯1:

這是服務器輸出的內容:

Apr 10, 2016 5:04:51 AM org.glassfish.jersey.filter.LoggingFilter log
INFO: 2 * Server has received a request on thread http-nio-8070-exec-2
2 > POST http://localhost:8070/web/feaf/fileupload
2 > accept: */*
2 > accept-encoding: gzip, deflate
2 > accept-language: en-US,en;q=0.8
2 > cache-control: no-cache
2 > connection: keep-alive
2 > content-length: 3903
2 > content-type: multipart/form-data
2 > host: localhost:8070
2 > origin: chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop
2 > postman-token: 4eb8418b-9976-ca61-6d0e-f98c7d96d3b8
2 > user-agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36

Apr 10, 2016 5:04:51 AM org.glassfish.jersey.filter.LoggingFilter log
INFO: 2 * Server responded with a response on thread http-nio-8070-exec-2
2 < 400

這是郵遞員的屏幕截圖: 在此處輸入圖片說明

編輯2:

這是web.xml。 我不得不更改服務名稱並切出一些不相關的servlet。

<?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"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">
  <display-name>MyWebservice</display-name>  
    <welcome-file-list>
        <welcome-file>status.jsp</welcome-file>
    </welcome-file-list>    

    <!-- RESTful services -->    
    <servlet>
        <servlet-name>feaf Service</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>web.feaf</param-value>
        </init-param>
        <init-param>
            <param-name>jersey.config.server.provider.classnames</param-name>
            <param-value>org.glassfish.jersey.filter.LoggingFilter;org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>feaf Service</servlet-name>
        <url-pattern>/web/feaf/*</url-pattern>
    </servlet-mapping>
</web-app>

編輯3:

多虧@Sanj,事實證明Jersey至少在Postman中拒絕了標頭中包含multipart-form-data的請求。 發送空標題可以解決此問題。

您的代碼看起來不錯。 依賴項(pom.xml)或web.xml可能存在問題。

這是使用jersey 2.22.1 @ https://github.com/shaimakh/so36524919的工作文件上傳示例

這是我的示例中的依賴項和web.xml:

pom.xml(依賴項)

    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>2.22.1</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-multipart</artifactId>
        <version>2.22.1</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
        <version>2.22.1</version>
    </dependency>

web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Restful File Upload</display-name>


    <servlet>
        <servlet-name>jersey-servlet</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.foo.rest</param-value>
        </init-param>
        <init-param>
            <param-name>jersey.config.server.provider.classnames</param-name>
            <param-value>org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>jersey-servlet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>



</web-app>

郵遞員輸出

郵遞員輸出

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM