在处理一个第三方加密回调时,需要读取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
相关推荐
当我们遇到“Java InputStream读取数据问题”时,通常涉及到如何正确、有效地使用`InputStream`及其子类来处理数据输入。 在给定的博客链接(由于实际链接无法访问,以下内容基于常见问题进行假设)中,可能讨论了...
本篇文章将详细讲解如何在Spring Boot应用中解决`InputStream`只能读取一次的问题。 首先,了解`InputStream`的工作原理。`InputStream`是Java I/O中的基础类,它定义了读取字节流的基本操作。当我们尝试从`...
inputstream读取数据的问题,对你的file的帮组是很大的。
例如,如果我们先调用了request.getParameter("name"),然后再使用IO流来获取body参数,那么获取到的body参数将为空字符串。 另外,在使用IO流来获取body参数时,我们需要注意IO流的读取顺序。如果我们先读取了body...
在Java编程中,有时我们可能需要将一个已经写入数据的`OutputStream`转换为`InputStream`,以便重新读取这些数据。这种情况通常出现在临时存储或处理数据时,例如在网络传输或者存储到内存中的场景。本篇文章将深入...
IO流文档InputStream / OutputStream IO流是一种基本的数据交换方式,在Java中,IO流是通过输入流(InputStream)和输出流(OutputStream)来实现的。输入流用于读取数据,而输出流用于写入数据。 InputStream是...
缺点:只支持本地文件,有时候会存在获取为null的情况。 方式二:使用MimetypesFileTypeMap MimetypesFileTypeMap是Java Activation API的一部分,提供了getContentType()方法,该方法可以根据文件的扩展名来检测...
可以先将`InputStream`转换为`byte[]`,然后再将`byte[]`转换为`Blob`: ```java public Blob inputStreamToBlob(InputStream is) throws IOException { byte[] data = inputStreamToByte(is); return ...
Java中的`InputStream`类是处理字节输入流的核心类,它是所有字节输入流类的超类,位于Java的`java.io`包中。作为抽象类,`InputStream`定义了一系列基本的方法来读取字节数据,这些方法由其子类进行具体实现。`...
3. 准备文件数据:将本地文件转换为`InputStream`或`MultiPartEntity`。 4. 发送POST请求,包含文件数据:`Response response = webResource.type(MediaType.MULTIPART_FORM_DATA).post(Response.class, fileEntity)...
关于InputStream和OutputStream关于InputStream和OutputStream关于InputStream和OutputStream关于InputStream和OutputStream
本文将深入探讨如何巧妙利用Jersey框架解决文件上传时可能出现的乱码问题,同时也会涉及Maven的使用,以构建Web应用。 首先,了解RESTful WebService的基本概念。REST(Representational State Transfer)是一种...
读取网络字节流 php stream 二进制
5. **下载图片**:使用`HttpURLConnection`或第三方库如Apache HttpClient发送GET请求,获取图片的`InputStream`。然后,创建一个`FileOutputStream`,将`InputStream`的数据写入到本地文件。 ```java URL url = ...
标准io流获取文件长度
一种常见的方法是先将`OutputStream`的数据写入内存中的`ByteArrayOutputStream`,然后再将其转换为`InputStream`: ```java ByteArrayOutputStream baos = new ByteArrayOutputStream(); OutputStream out = ...
标签中的"源码"提示我们可能需要深入理解`ServletOutputStream` 和`InputStream` 的内部实现,包括它们如何与网络I/O交互,以及如何处理缓冲区和数据编码等问题。而"工具"可能指的是使用这些流类来构建各种服务器端...
在Java世界中,Jersey是实现RESTful Web服务的一个强大框架。它基于JAX-RS(Java API for RESTful Web Services)规范,提供了一种创建高效、可扩展且易于使用的Web服务的方法。本教程将深入探讨如何使用Jersey实现...
深入剖析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...
例如,当我们创建一个Socket连接到服务器后,我们可以获取到一个`InputStream`实例,然后通过调用`read`方法来接收服务器发送的数据。当`read`方法被调用时,如果缓冲区中没有数据,那么这个方法会阻塞,直到有数据...