spring对controller返回值进行额外处理

Springboot实现文件与额外信息同时上传 文章目录前端实现新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 前端实现 // An highlighted ... 阅读详情

spring对controller返回值进行额外处理—翻译code

1.使用原生filter过滤器

​ filter会在映射方法的前后执行,是一个栈的调用过程,类似于spring 的aop执行链,把本身链的引用(包含有必要的上下文信息)传到具体的链中某一个执行策略中,在这个策略可以随意对整个链进行操作。

​ 思路:ServletResponse本身是无法获取返回内容的,所以必须对response进行劫持(代理),重写其中的写入内容方法,在filter调用返回时,获取返回内容,再进行额外的处理,写入到response中。

​ 学习了几篇博客,写出的简易demo如下:

ResponseContentWrapper类:

import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class ResponseContentWrapper extends HttpServletResponseWrapper {

    ByteArrayOutputStream buffer;
    ServletOutputStream out;

    public ResponseContentWrapper(HttpServletResponse response) {
        super(response);
        buffer = new ByteArrayOutputStream();
        out = new BufferOutPutStream(buffer);
    }

    public byte[] getContent() {
        return buffer.toByteArray();
    }

    @Override
    public ServletOutputStream getOutputStream() throws IOException {
        return out;
    }

    @Override
    public void flushBuffer() throws IOException {
        out.flush();
    }

    static class BufferOutPutStream extends ServletOutputStream {
        ByteArrayOutputStream buffer;

        public BufferOutPutStream(ByteArrayOutputStream buffer) {
            this.buffer = buffer;
        }

        @Override
        public boolean isReady() {
            return false;
        }

        @Override
        public void setWriteListener(WriteListener listener) {

        }

        @Override
        public void write(int b) throws IOException {
            buffer.write(b);
        }

    }

}

DataTranslateFilter类:

import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;

public class DataTranslateFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //这里面会执行其他的filter,并最终执行对应的映射方法
        //栈的调用过程,最终会返回到这里
        //类似于spring 的aop执行链,都是把本身链的引用传到具体的链中某一个具体策略中,在这个策略可以随意对之进行操作。
        ResponseContentWrapper wrapper = new ResponseContentWrapper((HttpServletResponse) servletResponse);
        filterChain.doFilter(servletRequest, wrapper);
        byte[] content = wrapper.getContent();
        String str=null;
        /*
         在这里对获取的内容做处理并用str指向对应结果
         */
        ServletOutputStream outputStream = servletResponse.getOutputStream();
        outputStream.write(str.getBytes(StandardCharsets.UTF_8));
        outputStream.flush();
    }
}

​ 配置filter到spring容器中,则按照框架要求的配置方法即可,即xml或者@bean

​ 不建议使用此方法,filter做通用的、与具体返回值无关的处理比较合适,例如字符类型的转换、访问相关的控制等,不适用于返回值的特殊处理,很大原因是因为返回的内容是一个流,关于返回值本身的信息获取不到。

2.使用@ControllerAdvice对Controller切面

​ 在spring的官方网站中看了下ControllerAdvice注解的介绍,这个注解中包含有@Component子注解,spring会自动将之加入到容器中。@ControllerAdvice修饰的类会对spring中管理的所有的Controller生效,常用的用法是结合@ExceptionHandler、@InitBinder和@ModelAttribute使用,做一些全局异常处理、参数转化为实体和访问和新加参数等工作。

​ @ControllerAdvice可以通过包路径、类、注解来确定作用范围。官网的示例:

// Target all Controllers annotated with @RestController
@ControllerAdvice(annotations = RestController.class)
public class ExampleAdvice1 {}

// Target all Controllers within specific packages
@ControllerAdvice("org.example.controllers")
public class ExampleAdvice2 {}

// Target all Controllers assignable to specific classes
@ControllerAdvice(assignableTypes = {ControllerInterface.class, AbstractController.class})
public class ExampleAdvice3 {}

​ 在本业务范围中,@ControllerAdvice要结合ResponseBodyAdvice接口使用,这个接口是springmvc提供的一个对返回内容作处理的钩子,实现这个接口的support和beforeBodyWrite方法即可,代码如下:

DataTranslateAdvice类:

import com.dengcl.datatranslate.codeannotation.SexCode;
import com.fasterxml.jackson.databind.util.JSONPObject;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@ControllerAdvice
public class DataTranslateAdvice implements ResponseBodyAdvice<Object> {

    private static final List<Class<?>> BASIC_OBJECT = new ArrayList<>();

    static {
        BASIC_OBJECT.add(Boolean.class);
        BASIC_OBJECT.add(Character.class);
        BASIC_OBJECT.add(Integer.class);
        BASIC_OBJECT.add(Long.class);
        BASIC_OBJECT.add(Integer.class);
        //and so on
    }

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        //判断是否匹配,应该根据一些注解或者类,来区分是否需要走beforeBodyWrite
        //这儿简单判定下是否有ResponseBody注解
        return returnType.hasMethodAnnotation(ResponseBody.class) || returnType.getDeclaringClass().getAnnotation(RestController.class) != null;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        //Object 可能是各种类型,这儿需要根据不同类型做各种不同的策略
        if (body == null) {
            return null;
        }
        if (BASIC_OBJECT.contains(body.getClass())) {
            return body;
        }
        //这儿没有导入json包,先用map暂存一下
        Map<String, Object> result = new HashMap<>();
        Field[] declaredFields = body.getClass().getDeclaredFields();
        for (Field declaredField : declaredFields) {
            try {
                declaredField.setAccessible(true);
                Object value = declaredField.get(body);
                result.put(declaredField.getName(), value);
                if (declaredField.getAnnotation(SexCode.class) != null && value != null) {
                    result.put(declaredField.getName() + "_translate", (Integer) value == 1 ? "男" : "女");
                }
            } catch (IllegalAccessException e) {
            }
        }
        return result;
    }
}

​ DataTranslateController类:

import com.dengcl.datatranslate.entity.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("dataTranslate")
public class DataTranslateController {
    @GetMapping("str")
    public User getStr() {
        User user = new User();
        user.setAddress("月亮之湾");
        user.setAge(20);
        user.setName("风箫");
        user.setSex(1);
        return user;
    }
}

​ User类:

public class User {
    @SexCode
    private Integer sex;
    private String name;
    private Integer age;
    private String address;

    public Integer getSex() {
        return sex;
    }

    public void setSex(Integer sex) {
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

​ 还有注解SexCode:

import java.lang.annotation.*;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface SexCode {
}

测试结果如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3vvIqbX6-1647860412221)(/Users/conglindeng/Library/Application Support/typora-user-images/image-20220321154640177.png)]

总结:在controller返回结果后,此刻需要将数据写入到responsebody中,springmvc提供了钩子,让开发这可以在写入到response之前,对body进行额外的处理,通过ControllerAdvice注解适配到spring工厂中发挥作用。

3.使用Spring提供的切面

​ 此方法实际和方法2大同小异,只不过使用到了spring提供的不同能力,方法2为模板方法的落地实现,方法3则为更通用的代理实现,两者本质都是在controller执行前后做一些额外处理。

​ 前置知识:aop相关的概念和配置等,这个简单看一下就理解了,不做过多赘述,直接上代码。DataTranslateAspect类:

import com.dengcl.datatranslate.codeannotation.SexCode;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Field;

@Aspect
@Component
public class DataTranslateAspect {

    @Around("execution(* com.dengcl.datatranslate.controller.*.*(..))")
    public Object dataTranslate(ProceedingJoinPoint joinPoint) throws Throwable {
        Object proceed = joinPoint.proceed();
        Field[] declaredFields = proceed.getClass().getDeclaredFields();
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        for (Field declaredField : declaredFields) {
            try {
                declaredField.setAccessible(true);
                if (declaredField.getAnnotation(SexCode.class) != null && declaredField.get(proceed) != null) {
                    Object value = declaredField.get(proceed);
                    request.setAttribute(declaredField.getName() + "_translate", (Integer) value == 1 ? "男" : "女");
                }
            } catch (IllegalAccessException e) {
            }
        }
        return proceed;
    }
}

​ 这里面有个与方法2不一样的点是:方法2是可以直接对返回值做处理的,放入到response中是没有类型要求的,此时可以直接添加想要的值、修改为需要的类型,返回即可。

​ 此方法不能直接在返回值上处理并返回的原因是:aop增强是对方法内的逻辑做额外的处理,不管如何增强、有多少增强,最终方法的返回类型要满足方法本身要求的类型。

总结:建议使用方法2中spring本身提供的钩子实现对返回结果的处理。方法1太古老,需要造很多轮子,方法3可以补充方法2不适用的一些情况。

Spring Controller核心原理与实战:从HTTP请求到JSON响应 Spring Controller是Spring MVC中处理HTTP请求的核心组件,其本质是基于IoC容器和声明式编程的Web层抽象。它通过注解驱动(如@Controller、@GetMapping)将URL路径、HTTP方法、参数绑定与Java方法建立映射关系,依托HandlerMapping、HandlerAdapter和HttpMessageConverter等机制,自动完成请求解析、数据绑定、业务调用与响应序列化。该设计显著降低了Web开发复杂度,使开发者聚焦业务语义而非协议细节。典型应用场景包括 阅读详情

相关推荐

DBeaver连接ClickHouse保姆级教程:从安装到成功测试(附驱动下载问题解决)

本文提供了一份详细的DBeaver连接ClickHouse实战指南,重点解决了驱动下载失败等常见问题。文章从环境准备、DBeaver安装讲起,详细阐述了手动配置ClickHouse驱动的可靠方案,并逐步指导完成连接配置与测试,最后介绍了基础操作与查询优化技巧,旨在帮助用户高效完成连接并快速上手使用。

pink的博客 880

SpringMVC中Controller返回的后续自定义处理

应用范围和场景 和统一异常处理不同,有些时候Controller处理可能需要做后续处理,例如关键字拦截,例如数据脱敏等,使用切面的方式比较复杂,如果Controller里需要后续处理的接口使用的都是@ResponseBody注解,那么实现ResponseBodyAdvice接口将是非常便利的处理方法,当然使用拦截器、HandlerMethodReturnValueHandler接口实现也是几种方法,这里仅示例更简单的ResponseBodyAdvice接口使用实现。 应用示例 ...

endcy的博客 928

别再一个个BAPI调了!用CVI_EI_INBOUND_MAIN一次性搞定SAP BP主数据(附完整ABAP代码)

本文详细介绍了如何使用SAP标准函数CVI_EI_INBOUND_MAIN高效维护业务伙伴(BP)主数据,替代传统的多BAPI调用方式。通过完整ABAP代码示例,展示了如何一站式处理供应商、客户、公司代码等所有视图的创建与更新,提升数据一致性和开发效率。

weixin_29204205的博客 297

SpringBoot 增强Controller方法,@ControllerAdvice注解的使用

⏹SpringBoot 增强Controller方法,@ControllerAdvice注解的使用

菜鸟记录 1万+

树莓派4B+WebRTC实现远程监控:5步搞定公网视频流传输(含Node.js配置)

本文详细介绍了如何利用树莓派4B和WebRTC技术,通过5个关键步骤搭建低延迟、高隐私的远程监控系统。重点阐述了WebRTC点对点传输相较于传统方案的优势,并提供了包含Node.js信令服务器配置、树莓派视频流捕获与推送、以及移动端自适应观看页面的完整实现方案,帮助用户实现公网视频流传输。

websocket5live的博客 292

网易数智CoreAgent实战:5步教你打造企业级AI数字员工(附避坑指南)

本文以网易数智CoreAgent智能体协作中枢为核心,提供了一份企业级AI数字员工的实战部署指南。文章详细拆解了从环境准备、智能体配置、业务集成、安全合规到效果评估的五个关键步骤,并分享了部署过程中的常见“避坑”经验,旨在帮助企业技术团队高效、安全地将AI智能体落地于实际业务场景,解决AI落地难题。

rice5的博客 954

springboot 之对controller返回值再处理

通常,我们在业务处理完之后,需要统一格式,之后返回到调用端。 Controller: @PostMapping(value = "test") @CustomResponse public Object test(){ System.out.println("testing......"); Map<String,Integer> map = new HashMap<>(); map.put("hello",2); return map; } 自定义

enjoy.day 3058

STM32的GPS数据提取程序设计说明——基于NMEA0183协议

一、硬软件平台 本次程序实现效果为对GPS信号穿送来的数据进行筛选,并将筛选后的信息通过上位机显示出来,所以此次设计所需硬件包括STM32F407、RS232转TTL、CH340USB转串口模块,注意该模块在使用前,对应的系统需要安装驱动,否则串口调试助手无法识别,另外还包括JLink下载器。 本次代码设计软件为KEIL5并结合F4固件包,上位机系统为WIN7,主机系统为WIN10。 二、算法总体思路设计 由于GPS通过RS232将数据传送给板子,因此使用两个串口资源(串口1和串口2),其中一个用来

小景的博客 6181

切面获取请求及返回数据

@Aspect @Component public class ConsoleLogAspect { /** * 设置切面点(切面地址根据自己的项目填写) */ @Pointcut(value = "(execution(* com.jx.smart.edu..controller.*.*(..)))") public void webLog() { } /** * 指定切点前的处理方法 * * @param j.

du_peng_fei的博客 4631

抖音用户主页视频数据爬虫详解(点赞,收藏,分享等)

的包中有个max_cursor参数,请求载荷中也有一个这样的参数,每次请求的数据中max_cursor是下一个请求的载荷,,,同时has_more为1时候代表还能请求,0为不能请求,我们做如下判断。最后发现cookie很容易过期,批量爬取有点困难,,,,我们采用drissoinpage进行自动化获取。首先进行抓包分析,,,随便找个主页,f12,关键词搜索,发现这个包是以post开头。请你第一次运行先按0,进行登录(或者触发反爬的时候),登录完成之后,按1进行爬取,完整代码请在知识星球。

m0_74823507的博客 3431

符合DO-178C和DO-331的机载软件研制体系

DO-178C的核心要求软件开发生命周期:DO-178C定义了软件开发的生命周期过程,包括需求获取、设计、实现、验证和确认等。它为机载软件开发提供了一套系统化的指导,确保在开发过程中考虑安全性和可靠性。安全等级(DAL):根据系统的重要性,DO-178C将软件划分为不同的开发保障等级(DAL A到E),DAL A的要求最为严格,适用于关键安全功能,而DAL E的要求较低,适用于非关键功能。DO-178C在非基于模型软件开发中的应用。

qq_41854911的博客 980

74_springboot整体修改controller返回值

 只需要增加一个这样的类就可以了。 @ControllerAdvice public class MyResponseBody implements ResponseBodyAdvice{ private static final Logger logger = LoggerFactory.getLogger(MyResponseBody.class); @Override publ...

谦虚的兔子的博客 3016

二、FM1288调试方案-工具软件使用

分析音频数据的软件需要满足以下几点:1、能打开原始pcm音频文件;2、基本的音频播放软件的操作;3、能查看分析音频数据的频率成分;4、能查看分析音频音量幅度;5、能完成基本音频处理:降噪、音量增幅限幅、滤波和均衡;

优快云mianfeixiazai001的博客 1295

controller的异常处理以及service层的事务控制___controller层 trycatch不影响service层抛出的异常

controller的异常处理以及service层的事务控制 最近写代码涉及到一些事务,上午终于把代码给理顺了,之前不太清楚在哪里做异常处理,导致代码遍地try-catch,相当难看。 还是基于controller-service-dao三层来写代码,从入口开始,controller层的方法对应的是某个url,面向的是应用人员,应该返回他们能读懂的信息,所以controller必须做异常处理,一般来说会有统一的异常处理方法; service层面向的是controller,service层中的某些方法,必须保

qq_43842093的博客 8791

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【Spring】Model,Util,Dao,Service,Controller

Java-Model,Util,Dao,Service,Controller Model层 Model = 模型。 Model是模型,一般而言,会有人分的更细,VO,DTO等等。我并不推荐分的更细,这个Model常常和持久化的数据一一对应,如Mysql和MongoDB。 Model承载的作用就是数据的抽象,描述了一个数据的定义,Model的实例就是一组组的数据。整个系统都可以看成是数据的 流动,既然要流动,就一定是有流动的载体。 它就应该是一个纯数据的集合,就是被各种东西传来传去,被各种.

南方有乔木的博客 7656

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Spring MVC的Controller统一异常处理:HandlerExceptionResolver

出现异常并不可怕,可怕的是出现了异常,你却不知道,也没有进行异常处理。 Spring MVC的Controller出现异常的默认处理是响应一个500状态码,再把错误信息显示在页面上,如果用户看到这样的页面,一定会觉得你这个网站太LOW了。 要解决Controller的异常问题,当然也不能在每个处理请求的方法中加上异常处理,那样太繁琐。Spring MVC提供了一个HandlerException

叉叉哥的BLOG 3万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SpringBoot统一封装controller层返回的结果

SpringBoot统一封装controller层返回的结果

weixin_43811057的博客 7449

Spring 中最常用的四个注解 Component、Controller、Repository、Service

总览 Spring 2.5 以后,除了提供基本的 @Component 注解之外,还提供了 @Service @Controller @Repository 三个注解。在 Spring 源码中,后面三个注解都在开始部分引入了 @Component 注解,除此以外这四个注解的源码内容没有任何区别,因此后面的这三个注解与 Component 的作用是一样的。之所以要额外的引出这三个注解,是为了更好的...

khxu666的博客 9819

Spring Boot 在controller前注入新参数

Spring Boot 在controller前注入新参数前言效果实现demo大功告成 前言 我们在前台访问controller时,想要获取用户信息,就可以用这个办法 效果 我们访问的时候只携带了一个json对象 在controller中可以额外接受到一个dog对象 @GetMapping("/hello") public String Test2(@RequestBody String people , Dog dog){ System.out.println(dog.g

宋大王的博客 1361

Spring MVC 的 Controller 使用详解

@RequestMapping 这个注解用来标记一个接口,这算是我们在接口开发中,使用最多的注解之一。 请求 URL 标记请求 URL 很简单,只需要在相应的方法上添加该注解即可: @Controller public class HelloController { @RequestMapping("/hello") public ModelAndView hello() { return new ModelAndView("hello"); } } 这里

彭楷淳在 优快云 521

Spring Web Controller常用注解

获取请求体中的数据(通常用于 JSON/XML 反序列化)。触发 JSR-303 Bean Validation 验证。:将返回值直接作为响应体(常用于 REST API)。:通用的请求映射,可指定路径、方法、请求头、参数等。:将请求参数绑定到模型对象,或用于在视图中暴露数据。,用于定义 RESTful 风格的控制器。:获取 URL 路径中的变量。:获取查询参数(URL 中的。:设置 HTTP 响应状态码。:获取 Cookie 值。:处理控制器内的特定异常。

250

用 Spring 管理 Controller,你觉得可行吗?

中的分析,所有 Bean 都注册到 Spring 容器之后,Spring 容器作为父容器,SpringMVC 作为子容器,按理说,由于子容器可以访问父容器中的 Bean,所以 SpringMVC 是可以正常访问 Spring 容器中的 Bean 的,所以,似乎把所有的 Bean 都扫描到 Spring 容器应该是没有问题的?所以,如果把 Controller 让 Spring 容器扫描并管理,那么就会导致在默认情况下,SpringMVC 容器找不到 Controller,进而导致所有的请求 404。

江南一点雨的专栏 381

Java Spring注解——Controller层、Service层、mapper层

常用Java注解

chenjianghhua的博客 2302

Spring MVC 如何处理文件上传? 需要哪些配置和依赖?如何在 Controller 中接收上传的文件 (MultipartFile)?

依赖: 添加和commons-io(如果使用配置: 在 Spring 配置中注册名为的bean (通常是或),并设置相关属性 (如大小限制)。Spring Boot 用户可以在中配置。HTML: 创建一个且的 HTML 表单,包含。Controller: 在 Controller 方法中使用(或) 来接收上传的文件。使用保存文件。安全不要信任的值来构建服务器上的文件路径;要清理它或生成唯一的文件名。验证文件类型 (MIME 和扩展名)。

专注于技术分享 1062

controller的异常处理以及service层的事务控制

最近写代码涉及到一些事务,上午终于把代码给理顺了,之前不太清楚在哪里做异常处理,导致代码遍地try-catch,相当难看。 还是基于controller-service-dao三层来写代码,从入口开始,controller层的方法对应的是某个url,面向的是应用人员,应该返回他们能读懂的信息,所以controller必须做异常处理,一般来说会有统一的异常处理方法; service层面向...

yuan487639的博客 6958

Spring boot 简单项目Controller页面跳转

spring Boot新建一个简单项目  就勾选web 一直点击Next   2.在启动类Apllication的同级新建一个包demo,再demo包下新建一个Controller包,在controller包下新建Controller项目 写完之后   在static包下的可以访问   但是在remplates包下不能访问   地址必须写全   不用在pox,xml中任何包...

zf_6744 2798
上一篇: LRU Java两种简单实现
下一篇: 父子项目,报找不到父项目的pom.xml
TalkingTo
博客等级 码龄7年 0粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值