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


    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这个解析器中,我们首先检查参数是否为 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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    在这个工具类中,我们首先从请求中提取 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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    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));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

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

    结论

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

    参考链接

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

  • 相关阅读:
    设计模式之单例模式应用例题
    通过宏定义解决编程难题
    [答疑]提前进行跑batch或者某种方式汇总购买货物的历史记录
    详解nginx的root与alias
    启动 Nginx.exe出现闪退的问题
    摩根士丹利选出10家公司参加其多元文化创新实验室的首个全球班
    Java面试题,每日积累,每日更新
    网络安全(黑客)自学
    [附源码]SSM计算机毕业设计汽车租赁管理系统-JAVA
    vue后台实现点击图片放大
  • 原文地址:https://blog.csdn.net/kaka_buka/article/details/136671162