2011-06-08 142 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