`

jersey获取inputstream body为空问题

    博客分类:
  • java
阅读更多

在处理一个第三方加密回调时,需要读取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的一个类似问题,试了下,成功了,特记录一下

https://stackoverflow.com/questions/40871054/inputstream-giving-null-data-in-messagebodyreader-jersey

 

上面的不能直接用,提供下我写的:

@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

 

 

 

2
0
分享到:
评论

相关推荐

    java InputStream读取数据问题

    当我们遇到“Java InputStream读取数据问题”时,通常涉及到如何正确、有效地使用`InputStream`及其子类来处理数据输入。 在给定的博客链接(由于实际链接无法访问,以下内容基于常见问题进行假设)中,可能讨论了...

    springboot 解决InputStream只能读取一次的问题

    本篇文章将详细讲解如何在Spring Boot应用中解决`InputStream`只能读取一次的问题。 首先,了解`InputStream`的工作原理。`InputStream`是Java I/O中的基础类,它定义了读取字节流的基本操作。当我们尝试从`...

    inputstream读取数据的问题

    inputstream读取数据的问题,对你的file的帮组是很大的。

    java通过HttpServletRequest获取post请求中的body内容的方法

    例如,如果我们先调用了request.getParameter("name"),然后再使用IO流来获取body参数,那么获取到的body参数将为空字符串。 另外,在使用IO流来获取body参数时,我们需要注意IO流的读取顺序。如果我们先读取了body...

    将输出流OutputStream转化为输入流InputStream的方法

    在Java编程中,有时我们可能需要将一个已经写入数据的`OutputStream`转换为`InputStream`,以便重新读取这些数据。这种情况通常出现在临时存储或处理数据时,例如在网络传输或者存储到内存中的场景。本篇文章将深入...

    IO流文档InputStream / OutputStream

    IO流文档InputStream / OutputStream IO流是一种基本的数据交换方式,在Java中,IO流是通过输入流(InputStream)和输出流(OutputStream)来实现的。输入流用于读取数据,而输出流用于写入数据。 InputStream是...

    Java获取文件ContentType案例

    缺点:只支持本地文件,有时候会存在获取为null的情况。 方式二:使用MimetypesFileTypeMap MimetypesFileTypeMap是Java Activation API的一部分,提供了getContentType()方法,该方法可以根据文件的扩展名来检测...

    Blob、InputStream、byte 互转

    可以先将`InputStream`转换为`byte[]`,然后再将`byte[]`转换为`Blob`: ```java public Blob inputStreamToBlob(InputStream is) throws IOException { byte[] data = inputStreamToByte(is); return ...

    Java中InputStream类.pdf

    Java中的`InputStream`类是处理字节输入流的核心类,它是所有字节输入流类的超类,位于Java的`java.io`包中。作为抽象类,`InputStream`定义了一系列基本的方法来读取字节数据,这些方法由其子类进行具体实现。`...

    springmvc远程上传文件jersey-client

    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关于InputStream和OutputStream

    InputStream

    读取网络字节流 php stream 二进制

    通过jsoup,输入流InputStream爬取图片PaQuPic.rar,有意者入

    5. **下载图片**:使用`HttpURLConnection`或第三方库如Apache HttpClient发送GET请求,获取图片的`InputStream`。然后,创建一个`FileOutputStream`,将`InputStream`的数据写入到本地文件。 ```java URL url = ...

    标准io流获取文件长度

    标准io流获取文件长度

    InputStream与OutputStream及File间互转

    一种常见的方法是先将`OutputStream`的数据写入内存中的`ByteArrayOutputStream`,然后再将其转换为`InputStream`: ```java ByteArrayOutputStream baos = new ByteArrayOutputStream(); OutputStream out = ...

    handleStream ServletOutputStream out = response.getOutputStream(); InputStream i

    标签中的"源码"提示我们可能需要深入理解`ServletOutputStream` 和`InputStream` 的内部实现,包括它们如何与网络I/O交互,以及如何处理缓冲区和数据编码等问题。而"工具"可能指的是使用这些流类来构建各种服务器端...

    jersey 文件上传-使用两种不同的方式

    在Java世界中,Jersey是实现RESTful Web服务的一个强大框架。它基于JAX-RS(Java API for RESTful Web Services)规范,提供了一种创建高效、可扩展且易于使用的Web服务的方法。本教程将深入探讨如何使用Jersey实现...

    Socket中InputStream的read方法的阻塞特性

    例如,当我们创建一个Socket连接到服务器后,我们可以获取到一个`InputStream`实例,然后通过调用`read`方法来接收服务器发送的数据。当`read`方法被调用时,如果缓冲区中没有数据,那么这个方法会阻塞,直到有数据...

    SocketInputStream.java

    深入剖析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...

    Jersey文件传输的文档及案例

    在Jersey中,我们可以使用`@FormDataParam`注解来获取上传的文件。以下是一个简单的服务端接口示例: ```java @Path("/upload") public class FileUploadService { @POST @Consumes(MediaType.MULTIPART_FORM_...

Global site tag (gtag.js) - Google Analytics