首页 > 其他分享 >SpringBoot 中使用自定义参数解析器修改请求对象

SpringBoot 中使用自定义参数解析器修改请求对象

时间:2024-03-14 09:59:02浏览次数:27  
标签:解析器 SpringBoot 自定义 CommonRequest springframework org import

SpringBoot 中使用自定义参数解析器修改请求对象

在 SpringBoot 应用中,有时我们需要在控制器方法执行之前对请求对象进行修改。自定义参数解析器提供了一种灵活的方式来实现这一需求。

1. 创建自定义参数解析器

首先,我们需要创建一个自定义参数解析器来处理对 CommonRequest 对象的修改。我们可以通过实现 HandlerMethodArgumentResolver 接口来完成这个任务:

import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import javax.servlet.http.HttpServletRequest;

@Component
public class CommonRequestResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterType().equals(CommonRequest.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
                                  NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
        HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
        CommonRequest modifiedRequest = RequestUtils.getAndModifyRequest(request);
        return modifiedRequest;
    }
}

在这个解析器中,我们首先检查参数是否为 CommonRequest 类型。如果是,我们就使用一个工具类 RequestUtils 来获取和修改请求对象。

2. 实现请求修改逻辑

接下来,我们需要实现 RequestUtils.getAndModifyRequest 方法来修改 CommonRequest 对象:

import com.fasterxml.jackson.databind.ObjectMapper;
import javax.servlet.http.HttpServletRequest;
import com.alibaba.fastjson.JSON;
import java.io.BufferedReader;
import java.io.IOException;

public class RequestUtils {
    public static CommonRequest getAndModifyRequest(HttpServletRequest request) {
        String json = extractJsonFromBody(request);
        CommonRequest originalRequest = convertJsonToRequest(json);
        // 修改 CommonRequest 对象的逻辑
        originalRequest.setBegin("0000-00-00");
        return originalRequest;
    }

    private static String extractJsonFromBody(HttpServletRequest request) {
        StringBuilder jsonBuilder = new StringBuilder();
        try (BufferedReader reader = request.getReader()) {
            String line;
            while ((line = reader.readLine()) != null) {
                jsonBuilder.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return jsonBuilder.toString();
    }

    private static CommonRequest convertJsonToRequest(String json) {
       return JSON.parseObject(json,Batch2CommonRequest.class);
    }
}

在这个工具类中,我们首先从请求中提取 JSON 字符串,然后将其转换为 CommonRequest 对象。接着,我们可以对这个对象进行任何所需的修改。

3. 注册自定义参数解析器

创建自定义参数解析器后,我们需要将其注册到 SpringBoot 的应用程序中。这可以通过实现 WebMvcConfigurer 接口并重写 addArgumentResolvers 方法来完成:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private CommonRequestResolver CommonRequestResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(CommonRequestResolver);
    }
}

4. 使用自定义参数解析器

一旦自定义参数解析器被注册,我们就可以在控制器方法中使用它了:


import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
public class MyController {

    @PostMapping("/sales-track/achievement-comparison")
    public ApiResponse<Levels<Progress>> getSalesTrackAchievementComparison(@RequestBody CommonRequest request) {
        // 使用修改后的 request 对象进行后续处理
        log.info("request:{}", JSON.toJSONString(request));
        return ApiResponse.success(salesTrackingService.getSalesTrackAchievementComparison(request));
    }
}

在这个示例中,当请求 /sales-track/achievement-comparison 路径时,CommonRequestResolver 将会自动修改 CommonRequest 对象,并将修改后的对象注入到控制器方法的参数中。

结论

通过使用自定义参数解析器,我们可以在 SpringBoot 应用中灵活地修改请求对象。这种方法提供了一种在控制器方法执行之前预处理请求数据的有效方式,从而增强了应用程序的灵活性和可扩展性。在实际开发中,根据需要灵活使用自定义参数解析器可以帮助您更好地控制请求处理流程和执行特定的操作。

参考链接

官网文档:SpringBoot 自定义参数解析器

标签:解析器,SpringBoot,自定义,CommonRequest,springframework,org,import
From: https://blog.csdn.net/kaka_buka/article/details/136671162

相关文章

  • 单据类型参数设置增加自定义参数并通过BOS标准函数调用
     1、BOS函数说明2、创建对应单据的【单据类型参数】,继承自【单据类型参数模版】。 3、在单据参数中绑定【单据类型参数对象】 4、参数设置设置对应参数 5、在BOS中调用标准函数进行使用。 ......
  • java毕业设计小众咖啡店推荐平台的设计与实现(springboot+mysql+jdk1.8+meven)
    本系统(程序+源码)带文档lw万字以上 文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景在当今社会,咖啡已经成为许多人日常生活中不可或缺的一部分。随着人们生活水平的提高和消费观念的转变,越来越多的人开始追求个性化和高品质的咖啡体验。小......
  • java毕业设计线上教学平台(springboot+mysql+jdk1.8+meven)
    本系统(程序+源码)带文档lw万字以上 文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景随着互联网技术的迅猛发展,线上教育已经成为了现代教学体系中不可或缺的一部分。尤其是在全球性的公共卫生事件影响下,线上教学平台显示出了其独特的优势和......
  • dock迁移备份(自定义镜像)
    1运行一个centos容器dockerrun-id--namecentos_vimcentos:centos72在容器中装vimdockerexec-ita6e240/bin/bashyuminstallvim-y3把容器做成镜像(centos+vim)dockercommitcentos_vimcentos_vim_image4把centos_vim容器删除dockerrmcentos_vim-f......
  • Matlab启动时实现自动切换到自定义的工作目录
    前言因为最近在学习数学建模,正好还需要用到Matlab这个软件来辅助学习。而我每次上课的时候启动我的Matlab都会从我的安装位置打开工作区(在我电脑上是:Z:\Matlab\bin),但是我自己为了整洁,从而新建了一个专门的文件夹来存放我的文件(在我电脑上是:D:\MatlabProject)。这就不得......
  • Day40:安全开发-JavaEE应用&SpringBoot框架&JWT身份鉴权&打包部署JAR&WAR
    目录SpringBoot-身份鉴权-JWT技术SpringBoot-打包部署-JAR&WAR思维导图Java知识点功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方组件使用等.框架库:MyBatis,SpringMVC,SpringBoot,Shiro,Log4j,FastJson等技术:Servlet,Listen,Filter,Interceptor,JWT,AOP,反射机制待......
  • 【开源】SpringBoot框架开发人事管理系统
    目录一、摘要1.1项目介绍1.2项目录屏二、功能模块2.1管理员功能模块2.2普通员工功能模块2.3答辩文案三、系统展示四、核心代码4.1查询职称4.2新增留言回复4.3工资申请4.4工资审核4.5员工请假五、免责说明一、摘要1.1项目介绍基于JAVA+Vue+SpringBo......
  • 【开源】SpringBoot框架开发班级考勤管理系统
    目录一、摘要1.1项目介绍1.2项目录屏二、功能模块2.1系统基础支持模块2.2班级学生教师支持模块2.3考勤签到管理2.4学生请假管理三、系统设计3.1功能设计3.1.1系统基础支持模块3.1.2班级学生教师档案模块3.1.3考勤签到管理模块3.1.4学生请假管理模块3.2......
  • 【开源】SpringBoot框架开发假日旅社管理系统
    目录一、摘要1.1项目介绍1.2项目录屏二、功能模块2.1系统介绍2.2QA问答三、系统展示四、核心代码4.1查询民宿4.2新增民宿评论4.3查询民宿新闻4.4新建民宿预订单4.5查询我的民宿预订单五、免责说明一、摘要1.1项目介绍基于JAVA+Vue+SpringBoot+MySQ......
  • Vue学习笔记51--解绑组件自定义事件
    解绑组件自定义事件//this.$off('defineMyEvent')//解绑一个自定义事件//解绑多个自定义事件//this.$off(['defineMyEvent','demoEvent'])//等价于this.$off()//解绑所有自定义的事件this.$off()注意:如果vm被销毁,则其所有......