2011-06-08 141 views
5

是否有可能接收表單參數作爲與澤西的字節數組?Java Jersey:接收表單參數作爲字節數組

我試過如下:

@Path("/someMethod") 
@POST 
@Produces(MediaType.TEXT_HTML) 
@Consumes(MediaType.APPLICATION_FORM_URLENCODED) 
public String someMethod(@FormParam("someParam") byte[] someParam) 
{ 
    return ""; 
} 

但得到這個錯誤:如果我改變字節[]爲String,一切正常

SEVERE: The following errors and warnings have been detected with resource and/or provider classes: 
    SEVERE: Missing dependency for method public java.lang.String SomeClass.someMethod(byte[]) at parameter at index 0 
    SEVERE: Missing dependency for method public java.lang.String SomeClass.someMethod(byte[]) at parameter at index 0 
    SEVERE: Method, public java.lang.String SomeClass.someMethod(byte[]), annotated with POST of resource, class SomeClass, is not recognized as valid resource method. 

我需要接收數據爲byte []而不是String的原因是因爲數據可能使用不同的字符集進行編碼。它取決於提交數據的HTML文檔,我需要在服務器端正確解碼數據(編碼字符集是在單獨的參數中提交的)。

所以,如果我可以接收數據爲byte [],它將解決我的問題。任何其他解決方案也是受歡迎的。

謝謝!

+0

不會'MediaType.APPLICATION_FORM_URLENCODED'暗示它是%編碼的,所以你可以只使用一個字符串?我在這裏猜測,但如果它真的是原始字節,也許你應該添加@Consumes(MediaType.TEXT_PLAIN)或其他一些代表原始二進制數據的MIME類型。 – MatrixFrog 2011-06-08 17:18:58

+0

是的,它是%編碼的,沒關係。我只是從HTML FORM發佈數據。 是的,我可以使用一個字符串,但是會發生的是,澤西不正確地創建包含特殊字符的字符串,因爲澤西需要知道字符集,並且我在一個單獨的參數中發佈字符集。 這就是爲什麼我想要以byte []形式獲取數據而不是以String形式獲取數據,所以我可以使用正確的字符集正確地創建String。 – 2011-06-08 18:43:43

+0

好的,是的,我想我在第一次閱讀時就誤解了這個問題。也許你可以通過澤西島的來源挖掘,並找到它實際上%解碼並轉換爲一個字符串...我不知道澤西島是否在某個地方做出一些不正確的假設。另一種可能是將整個輸入作爲'byte []'來使用(只需放棄'@ FormParam'),然後自己解析它。 – MatrixFrog 2011-06-08 18:57:01

回答

2

如果澤西符合JAX-RS符合規範,則參數可以是

  1. A primitive type
  2. Have a constructor that accepts a single String argument
  3. Have a static method named valueOf that accepts a single String argument (see, for example, Integer.valueOf(String))
  4. List, Set or SortedSet, where T satisfies 2 or 3 above. The resulting collection is read-only.

,因爲它是在實際the Jersey API定義。

如果您想使用@FormParam,您可以做的最好的定義一個ByteArray - 類,它處理由字符串轉換引起的錯誤並將其用作參數類型。

+1

字符串的問題是,當我收到參數爲字符串時,特殊字符被替換爲?,所以它們已經丟失... – 2011-06-08 19:28:15

+2

我翻遍了球衣代碼,發現它包含了'ByteArrayProvider',它消耗併產生了'MediaType .APPLICATION_OCTET_STREAM'並支持'byte [] .class'。可能值得一試? – 2011-06-08 19:40:49

1

謝謝你的回答!我終於找到了解決方案... 現在,我看到一個解決方案,我明白,我沒有足夠好地描述我的問題,並導致你到一個不同的方向...

問題是,我提交表單數據從許多不同的頁面使用不同的編碼到服務器。 當頁面使用utf-8編碼時,一切正常,但當頁面使用不同的編碼時,特殊字符丟失了。

解決的辦法是添加accept-charset="utf-8"到<FORM> html元素,這引起瀏覽器形式的數據總是以編碼UTF-8編碼,其解決了在服務器端編碼的問題。

謝謝!

+0

在IE中,上述解決方案無效...發佈了另一個關於它的問題... – 2011-06-09 09:17:53