当前位置: 首页 > 知识库问答 >
问题:

如何在控制器之前覆盖SpringBoot中的InputStream?

章昱
2023-03-14

在spring boot中@RequestBody内容到达控制器之前,我如何覆盖它?

>

此外,我还搜索了Request estBodyAdviceAdapter。

有几个链接对spring boot不起作用。

如何多次读取request.getInputStream()

如何在Spring引导到达控制器之前修改请求正文

现在,我可以将输入流读入字符串中,进行一些修改并设置回控制器的输入流吗?

共有2个答案

姜淇
2023-03-14

这看起来是一个很好的Servlet过滤器用例。过滤器将在控制器之前接收请求,允许您修改请求,然后您可以将请求向下传递到过滤器链以供控制器处理。

示例:https://www.baeldung.com/spring-boot-add-filter

您需要编写一个自定义的HttpServletRequest estWrapper。在此包装器类构造函数将接收请求。将InputStream读入html" target="_blank">变量(此时您可以修改流)。还覆盖getInputStream()和getReader()方法以返回修改后的流(而不是原始流)。

在您的过滤器中,创建包装器的新实例并将传入的请求传递到构造函数中。完成修改后,将包装后的请求传递到chain.doFilter(myWrapedRequest,响应)以允许下游控制器处理它。

以下是如何创建包装并在过滤器中使用它的示例:https://howtodoinjava.com/servlets/httpservletrequestwrapper-example-read-request-body/

方恺
2023-03-14

解决方案1:(在我看来更好的解决方案)正如评论中建议的那样,尝试为对象使用@JsonProperty或自定义De-/Serializer。

解决方案2:添加@ControllerAdvice并实现RequestBodyAdvice,并重写beforeBodyRead as

@Override
public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) throws IOException {
    InputStream body = inputMessage.getBody();
    String bodyStr = IOUtils.toString(body, Charset.forName("UTF-8"));
    /*
    Update bodyStr as you wish
    */
    HttpInputMessage ret = new MappingJacksonInputMessage(new ByteArrayInputStream(bodyStr.getBytes()), inputMessage.getHeaders()); //set the updated bodyStr
    return ret;
}
 类似资料:
  • 我有一个POJO类,它具有类的注释。 控制器看起来像这样。 现在,我有一个基于类型字段的值的要求,需要在最终生成的JSON中为值字段返回null。 例如,如果 type='XYZ',则响应将为 。如果 type='ABC',则响应应为 我怎样才能在春靴中实现这一点?处理这种情况的最好方法是什么?

  • 问题内容: 是否有可能覆盖最后的输出,所以我可以例如可视化数组中的更改或创建一个进度栏? 例如,如果我有这个课: 我必须怎么做才能创建一个简单的进度条,而不是显示在10行中? 问题答案: 这可以在我的特定控制台(Windows)上使用,但不是很便携… 还有课程,但据我所知实际上并没有买多少钱……

  • > 我有两个控制器(ControllerA和ControllerB) 两个控制器都调用一个服务(MyService)。 MyService调用名为MyRepository的接口,该接口有两个实现(FirstRepository和SecondRepository)。 如何可能在从ControllerA调用服务(MyService)时使用FirstRepository而在调用来自ControllerB

  • 我正在开发一个Spring应用程序,并在HandlerInterceptorAdapter的预处理()方法中对用户进行身份验证,如果用户进行了身份验证,我将如下设置请求属性: 如果用户未通过身份验证,我是这样设置的 然后在稍后的控制器方法中,我用HttpServletRequest检索用户,如下所示: 问题是我需要在每个控制器方法中接收HttpServletRequest,以检查用户是否经过身份验

  • 问题内容: 互联网上有一些重叠式教程,有时会全部使用 。 这在我的项目中某种程度上是不可能的,因为(我猜)我的视图在任何时候都没有使用(的一部分)构造函数。 在ViewController的viewDidLoad中,基本上仅创建MainScene: …在这里(注意:SCNScene而不是SCNView): 场景已完美创建,我现在想覆盖一个SKScene。有人知道吗? 问题答案: SpriteKit

  • 问题内容: 是否可以强制重命名os.rename覆盖另一个文件(如果已经存在)?例如,在下面的代码中,如果文件Tests.csv已经存在,则将其替换为Tests.txt文件(该文件也已重命名为Tests.csv)。 问题答案: 您可以尝试: 或然后: