2015-04-02 170 views
1

http://www.mkyong.com/webservices/jax-rs/file-upload-example-in-jersey/ 我按照本指南運行時出現問題。我有一些疑問。org.glassfish.jersey上傳帶有FormDataContentDisposition的文件

  1. 是否所有的依賴項都必須對應?我的項目有一些org.glassfish.jersey的依賴關係,本指南建議使用org.sun.jersey。我是否也必須使用同樣的版本更改它?

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

  2. 我有這樣的錯誤

    org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization. [[FATAL] No injection source found for a parameter of type public ***.***.****.common.dto.response.AbstractResponse ***.***.****.m2m.instancetypeupload.webservice.InstanceTypeUploadWebService.upload(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition) at index 0.; source='ResourceMethod{httpMethod=POST, consumedTypes=[multipart/form-data], producedTypes=[application/json], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=ClassBasedMethodHandler{handlerClass=class ***.***.****.m2m.instancetypeupload.webservice.InstanceTypeUploadWebService, handlerConstructors=[[email protected]]}, definitionMethod=public ***.***.***.common.dto.response.AbstractResponse ***.***.*****.m2m.instancetypeupload.webservice.InstanceTypeUploadWebService.upload(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition), parameters=[Parameter [type=class java.io.InputStream, source=file1, defaultValue=null], Parameter [type=class org.glassfish.jersey.media.multipart.FormDataContentDisposition, source=file1, defaultValue=null]], responseType=class ***.***.***.common.dto.response.AbstractResponse}, nameBindings=[]}'] 
    

    這是我的web服務

    @POST 
    @Path("/upload") 
    @Consumes(MediaType.MULTIPART_FORM_DATA) 
    @Produces(MediaType.APPLICATION_JSON) 
    public AbstractResponse upload(@FormDataParam("file1") InputStream file1, 
              @FormDataParam("file1") FormDataContentDisposition filename1 
             ) { 
    

    這是我的電話:

    $.ajax({ 
         url: 'http://localhost:8080/******/webapi/m2m/upload', 
         data: fd, 
         processData: false, 
         contentType: 'multipart/form-data', 
         type: 'POST', 
         success: function(data){ 
         alert(JSON.stringify(data)); 
         return; 
         } 
        }); 
    

如果Web服務只有1個參數(FormData InputStream),則該服務是可到達的。如何解決它?

  1. 我還想爲Web服務添加另一個字符串參數。我該怎麼辦?

謝謝peeskillet的答案。有點額外。

SEVERE: The web application [/linterm2m] created a ThreadLocal with key of type [org.jvnet.hk2.internal.PerLocatorUtilities$1] (value [[email protected]]) and a value of type [java.util.WeakHashMap] (value [{}]) but failed to remove it when the web application was stopped. This is very likely to create a memory leak. 

回答

5

如果項目使用org.glassfish,您使用的球衣2. com.sun是澤西1,你不應該將兩者攪和。這就是說,你面臨的錯誤很可能是由於你沒有註冊MultipartFeature。當資源模型(資源方法)在啓動時對「正確性」進行驗證時,如果該功能未註冊,則此功能的註釋是未知的,就像沒有註釋一樣。你不能有多個方法param沒有註釋。

如果您使用的是ResourceConfig,你可以簡單地如果您正在使用的web.xml應用

public class JerseyConfig extends ResourceConfig { 
    public JerseyConfig() { 
     register(MultiPartFeature.class); 
    } 
} 

,則可以設置<init-param>澤西你的servlet註冊

<init-param> 
    <param-name>jersey.config.server.provider.classnames</param-name> 
    <param-value>org.glassfish.jersey.media.multipart.MultiPartFeature</param-value> 
</init-param> 

「我還想爲Web服務添加另一個字符串參數,我該怎麼辦?」

您需要將它作爲多部分請求的一部分,並且客戶端需要確保將它作爲多部分的一部分發送。在服務器端添加另一個@FormDataParam("anotherString") String anotherString作爲方法參數。至於客戶端,我不知道jQuery會幫助解決這個問題。尚未測試,但您可以嘗試this,其中顯示的數據將附加到FormParam。這裏是something with Angular,我自己構建了請求主體。可能會有點兒,因爲你可能不需要明確設置內容類型。

+0

謝謝你的web.xml部分。我在其他地方找不到它。目前我正在查看更多內容。 – dtxd 2015-04-02 06:59:37

+0

它現在工作得很好。再次感謝您的努力。萬一你知道,我可以問這個錯誤嗎?我將把它放在帖子中 嚴重:Web應用程序[/ linterm2m]創建了一個ThreadLocal類型的鍵[org.jvnet.hk2.internal.PerLocatorUtilities $ 1](值爲[org.jvnet.hk2.internal.PerLocatorUtilities $ 1 @ df94b1])和一個類型爲[java.util.WeakHashMap](值爲[{}])的值,但在Web應用程序停止時未能刪除它。這很可能造成內存泄漏。 – dtxd 2015-04-02 07:25:04

+0

我不知道,但我今天早上讀到的一件事是Glassfish中Jersey版本的問題。很可能您使用的Jersey版本比Glassfish中的版本更新。我不確定你使用的是什麼版本,但是找出你使用的是什麼版本的Jersey Glassfish([這可能有幫助])(http://blog.dejavu.sk/2014/01/21/updating-jersey -2-in-glassfish-4 /)),並將您在項目中使用的版本更改爲它。您也可以嘗試將「」提供的'添加到兩個依賴項。不知道這是否是問題,但你可以測試 – 2015-04-02 07:31:11