在处理一个第三方加密回调时,需要读取body的byte内容,用了springMVC后,字节数不对,后因大部分API使用jersey, 故决定用jersey, 但jersey中想要获取request的body时遇到一直无法获取的问题
取body的多种方式
@Post //直接注入body(也可以是String) public void doSomething(byte[] body) @Post //直接注入inputStream后读取 public void doSomething(InputStream inputStream) @Post //从request读inputStream再读取 public void doSomething(@Context HttpServletRequest request)
结果试了各种方式,要么读不到,要么报下面这些错。。。
Only resource methods using @FormParam will work as expected
getInputStream() has already been called for this request
The resource configuration is not modifiable in this context.
跟据经验InputStream只能被取一次,在配置对的情况下,还取不到大概都是这个问题,且报错也有该提示,然后主要方向就是这个了,推测是某个filter先用了inputStream,一看Springboot 自动注入了8个。。。表示想一个个找会很痛苦了
最后找到了stackoverflow的一个类似问题,试了下,成功了,特记录一下
上面的不能直接用,提供下我写的:
@Configuration public class FilterConfig { @Bean public HiddenHttpMethodFilter hiddenHttpMethodFilter() { return new MyHiddenHttpMethodFilter(); } class MyHiddenHttpMethodFilter extends HiddenHttpMethodFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { if ("POST".equals(request.getMethod()) && MediaType.APPLICATION_FORM_URLENCODED.equals(request.getContentType())){ //Skip this filter and call the next filter in the chain. filterChain.doFilter(request, response); } else { //Continue with processing this filter. super.doFilterInternal(request, response, filterChain); } } } }
配置好后直接就可以各种花式读到body了。。。
后记:好奇为什么springboot会配这样一个HiddenHttpMethodFilter
查了下,原来是为了将form表单扩展,使之支持DELETE PUT。
说是在这个filter里将原始POST替换为form表单中的对应的,再传到后面处理。
具体没看了
个人博客地址:http://lnxts.com/issue/jersey-body-null.html
相关推荐
springboot 解决InputStream只能读取一次的问题
NULL 博文链接:https://cuisuqiang.iteye.com/blog/1434416
inputstream读取数据的问题,对你的file的帮组是很大的。
主要介绍了Java获取文件ContentType案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
关于InputStream和OutputStream关于InputStream和OutputStream关于InputStream和OutputStream关于InputStream和OutputStream
NULL 博文链接:https://shihuan830619.iteye.com/blog/2094068
Java中InputStream类.pdf 学习资料 复习资料 教学资源
读取网络字节流 php stream 二进制
标准io流获取文件长度
IO流文档,相关IO流的说明文档.............
Blob、InputStream、byte 互转
深入剖析tomcat第三章SocketInputStream源码 * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/util/StringManager.java,v 1.2 2001/07/22 20:25:14 pier Exp $ * $Revision: 1.2...
InputStream与OutputStream及File间互转
Java SE程序 文件的拷贝InputStream类Java SE程序 文件的拷贝InputStream类Java SE程序 文件的拷贝InputStream类Java SE程序 文件的拷贝InputStream类Java SE程序 文件的拷贝InputStream类Java SE程序 文件的拷贝...
原理讲解-ServletInputStream.readLine(byte[] b, int off, int len) 方法原理讲解-ServletInputStream.readLine(byte[] b, int off, int len) 方法
InputStream的用法2 --- 马克-to-win java视频 输入流
InputStream的用法1 ---马克-to-win java视频 输入流
在这个问题中对 StackOverlow 所有功劳: : 从 Volley 作为 InputStream 获得响应非常困难。 有些人需要它来进行消息包编码,我需要它来获取作为 InputStream 的图像响应,以便我可以将分段上传到另一个 URL。 从那...
NULL 博文链接:https://superherosk123.iteye.com/blog/611933
通过jsoup爬取网上图片,其中包括输入流InputStream的用法