Java Jersey:以字节数组形式接收表单参数

Java Jersey:以字节数组形式接收表单参数,java,encoding,character-encoding,bytearray,jersey,Java,Encoding,Character Encoding,Bytearray,Jersey,是否可以使用Jersey以字节数组的形式接收表单参数 我尝试了以下方法: @Path("/someMethod") @POST @Produces(MediaType.TEXT_HTML) @Consumes(MediaType.APPLICATION_FORM_URLENCODED) public String someMethod(@FormParam("someParam") byte[] someParam) { return ""; } 但我犯了这个错误: SEVERE: T

是否可以使用Jersey以字节数组的形式接收表单参数

我尝试了以下方法:

@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,则一切都正常工作

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

因此,如果我能以字节[]的形式接收数据,它将解决我的问题。我们也欢迎任何其他解决方案


谢谢大家!

如果Jersey符合JAX-RS规范,则参数可能为

  • 原始类型
  • 具有接受单个字符串参数的构造函数
  • 有一个名为valueOf的静态方法,该方法接受单个字符串参数 (例如,见, 整数.valueOf(字符串))
  • 列出、设置或分类数据集,其中T满足上述2或3。这个 生成的集合是只读的
  • 正如在中实际定义的那样


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

    谢谢你的回答!我终于找到了解决办法。。。 现在,我看到了一个解决方案,我明白我没有很好地描述我的问题,它会把你带到一个不同的方向

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

    解决方案是向html元素添加
    accept charset=“utf-8”
    ,这使得浏览器总是将表单数据编码为utf-8编码,从而解决了服务器端的编码问题


    谢谢大家!

    MediaType.APPLICATION\u FORM\u URLENCODED
    是否意味着它是%-编码的,所以您可以只使用一个字符串?我在这里有点猜测,但如果它真的是原始字节,也许你应该添加@Consumes(MediaType.TEXT_PLAIN)或其他一些表示原始二进制数据的MIME类型。是的,它是%-编码的,没问题。我只是从HTML表单发布数据。是的,我可以使用字符串,但是Jersey错误地创建了包含特殊字符的字符串,因为Jersey需要知道字符集,我将字符集发布在单独的参数中。这就是为什么我想以byte[]而不是String的形式获取数据,这样我就可以使用正确的字符集正确地创建String。好的,是的,我想我第一次读这个问题时误解了。也许你可以在Jersey源代码中找到它的实际位置-解码并转换成字符串。。。我想知道泽西是否在某个地方做出了一些错误的假设。另一种可能是将整个输入作为
    字节[]
    (只需去掉
    @FormParam
    )使用,然后自己解析它。字符串的问题是,当我以字符串形式接收参数时,特殊字符会被替换为?,所以它们已经丢失了…我仔细查看了jersey代码,发现它包含
    ByteArrayProvider
    ,它使用并生成
    MediaType.APPLICATION\u OCTET\u STREAM
    并支持
    byte[].class
    。也许值得一试?