Java Jersey:接收表单参数作为字节数组

是否可以使用Jersey接收form参数作为字节数组?

我尝试了以下方法:

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

但得到了这个错误:

 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,一切正常。

我需要以byte []而不是String的forms接收数据的原因是因为数据可能使用不同的字符集进行编码。 它取决于提交数据的HTML文档,我需要在服务器端正确解码数据(编码字符集在单独的参数中提交)。

所以,如果我能以byte []的forms接收数据,它将解决我的问题。 欢迎任何其他解决方案。

谢谢!

如果Jersey符合JAX-RS规范,那么参数可能是

  1. 原始类型
  2. 有一个接受单个String参数的构造函数
  3. 有一个名为valueOf的静态方法接受单个String参数(例如,参见Integer.valueOf(String))
  4. List,Set或SortedSet,其中T满足上面的2或3。 生成的集合是只读的。

因为它实际上是在Jersey API中定义的 。

如果您想最好地使用@FormParam,您可以定义一个ByteArray类来处理由String转换引起的错误并将其用作参数类型。

谢谢您的回答! 我终于找到了一个解决方案……现在我看到了一个解决方案,我明白我没有很好地描述我的问题,它会引导你走向另一个方向……

问题是我从使用不同编码的许多不同页面向服务器提交表单数据。 当页面使用utf-8编码时,一切正常,但当页面使用不同的编码时,特殊字符丢失。

解决方案是将accept-charset="utf-8"

html元素,这导致浏览器始终将表单数据编码为utf-8编码,这解决了服务器端的编码问题。

谢谢!