Java Jersey:以字节数组形式接收表单参数
是否可以使用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
@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规范,则参数可能为
如果您想最好地使用@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
。也许值得一试?