Controller 中的请求方法,private 和 public有什么区别?别用错了!

这篇具有很好参考价值的文章主要介绍了Controller 中的请求方法,private 和 public有什么区别?别用错了!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者:hinotoyk
链接:https://juejin.cn/post/6910215219822362632

背景:某日在公司中撸代码的时候,在一个常用的controller中添加一个方法,测试时突然报错说注入的service为null,捣鼓一阵发现后是方法修饰符写成private,修改成public后搞定。为什么会产生这个问题呢?就自己测试一下是哪里发生了问题

首先简单模拟一下环境

Spring Boot 基础就不介绍了,推荐看这个实战项目:

https://github.com/javastacks/spring-boot-best-practice

public interface TestService {
    String getTestString();
}


@Service("testService")
public class TestServiceImpl implements TestService {
    @Override
    public String getTestString() {
        return "hinotoyk";
    }
}
    

@RestController
public class MainController {
    @Autowired
    private TestService service;

    @RequestMapping("/testA")
    public String testA(){
        return service.getTestString();
    }
    @RequestMapping("/testB")
    private String testB(){
        return service.getTestString();
    }

}

/testA是pulibc,/testB是pirvate,测试结果均能返回"hinotoyk"字符串

测试和公司环境还有一个不太同的就是公司项目中有Aop切面处理访问日志的,还要添加一个Aop

@Aspect
@Component
public class WebLogAspect {
    private final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);

    @Pointcut("execution(public * com.spring.controller..*.*(..))")
    public void controllerLog(){}

    @Before("controllerLog()")
    public void logBeforeController(JoinPoint joinPoint) {
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest();
        logger.info("*************URL : " + request.getRequestURL().toString());
        logger.info("*************HTTP_METHOD : " + request.getMethod());
        logger.info("*************IP : " + request.getRemoteAddr());
    }    
}

添加了一个 Aop 后测试:

/testA返回"hinotoyk"字符串

/testB访问报错,service注入失败,为null

为什么使用Aop会导致private修饰的方法注入失败,查询了许多资料后发现一位老哥的SpringAOP导致@Autowired依赖注入失败中说到org.springframework.aop.support.AopUtils中的代码使用的是Method[] methods = clazz.getMethods(),即是只能拿到public方法。但是我使用的版本2.1.4.RELEASE中已经使用Method[] methods = ReflectionUtils.getAllDeclaredMethods(clazz);这就有点迷惑了

会不会是切点注解中的修饰符匹配不到呢?将切点中的修饰符从public修改成private

@Pointcut("execution(private* com.spring.controller..*.*(..))")
public void controllerLog(){}

测试结果:

/testA返回"hinotoyk"字符串

/testB访问报错,service注入失败,为null

还是不行(就挺秃然的)

目前结论

  1. 方法中没有用@Autowired或者@Resource注入的对象。有无Aop,任意修饰符都可以正常访问并且返回结果
  2. 方法中使用了@Autowired或者@Resource注入的对象
    没有Aop切面的情况下,public,protected,private都能正常的映射
    在有Aop切面的情况下,public,protected可以正常映射,但是使用private会报空指针异常,注入对象为null

近期热文推荐:

1.1,000+ 道 Java面试题及答案整理(2022最新版)

2.劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!

5.《Java开发手册(嵩山版)》最新发布,速速下载!

觉得不错,别忘了随手点赞+转发哦!文章来源地址https://www.toymoban.com/news/detail-711326.html

到了这里,关于Controller 中的请求方法,private 和 public有什么区别?别用错了!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第八章:私有 / 公共函数 Private / Public Functions

    ​ Solidity 定义的函数的属性默认为公共。 这就意味着任何一方 (或其它合约) 都可以调用你合约里的函数。 显然,不是什么时候都需要这样,而且这样的合约易于受到攻击。 所以将自己的函数定义为私有是一个好的编程习惯,只有当你需要外部世界调用它时才将它设置为公

    2024年02月11日
    浏览(42)
  • 【C++】继承和多态、public、private、protected、重写

    继承是一种机制,通过它 一个类可以从另一个类继承属性和方法 。派生类(子类)继承基类(父类)的成员函数和数据成员,并且可以在其基础上扩展自己的成员函数和数据成员。C++支持多重继承,即一个派生类可以同时从多个基类中继承。 多态是指 同一种操作作用于不同

    2024年02月03日
    浏览(38)
  • Unity 之 变量修饰符public 与private 以及默认

    当在Unity中使用 public 修饰符时,它将变量声明为 公共变量 ,这意味着该变量可以在Unity编辑器中进行设置,并且可以从其他脚本中访问和修改。公共变量在Unity中广泛用于在脚本之间共享数据,以及在Inspector面板中显示自定义设置。以下是关于 public 修饰符的详细信息和示例

    2024年02月11日
    浏览(34)
  • C#类(一):类和对象---private、protected、public

    随着我国国力逐渐强盛,在多个城市中已经搭建了更为方便的公共交通:地铁。 搭乘地铁的之前,工作人员会对所有乘客进行安检,除了乘客的提包,而且还要确保乘客没有随身携带危险物品。 本关任务:编写一个乘客类,乘客成员属性包括提包和衣物,其中提包对工作人

    2024年02月06日
    浏览(27)
  • 【接口】HTTP(3) |GET和POST两种基本请求方法有什么区别

    在我面试时,在我招人面试别人时,10次能遇到7次这个问题,我听过我也说回答过: Get: 一般对于从服务器取数据的请求可以设置为get方式 Get方式在传递参数的时候,一般都会把参数直接拼接在url上 Get请求方法可以传递的参数数据量是有限的(因为一般参数是拼接在url上,

    2024年04月12日
    浏览(35)
  • Java当中四种权限刨析( private、default、protected、public)

    目录 一、java权限简介 二、举例使用 1.private 2.默认权限(default) 3.protected 4.public 注意        java当中有4种访问修饰限定符privat、default(默认访问权限),protected以及public。只有默认访问权限和public能够用来修饰类。修饰类的变量和方法四种权限都可以。 private:如果一个

    2024年02月06日
    浏览(35)
  • 【Java】一文彻底弄懂访问修饰符(public/protected/默认/private)--建议收藏

    博主简介: 努力学习的预备程序媛一枚~ 博主主页: @是瑶瑶子啦 所属专栏: Java岛冒险记【从小白到大佬之路】  OOP(Object Oriented Programing),即面向对象编程,最重要的功能/特点之一就是 封装 ,这点在该专栏开篇博客【Java基础篇】Java重要特性,JDK,JRE,JVM区别和联系,环境变量

    2024年02月22日
    浏览(36)
  • springboot的controller如何拿到post请求中的json数据

    在SpringBoot的Controller中,可以使用注解@RequestBody来获取POST请求中的JSON数据。我们可以将这个注解应用到一个Controller方法的参数上,Spring将会负责读取请求正文中的数据,将其反序列化为一个Java对象,并将其作为Controller方法的参数传递。以 Java 代码为例,示例代码如下: 在

    2024年02月15日
    浏览(28)
  • 【SpringBoot】常用的的各种注解(一):Controller中的请求参数

    请求路径中的参数,可以有一个或者多个 在Postman中也是直接在请求路径中添加参数即可 获取查询参数,形式为 url?name=张三 ,可以有一个或者多个。 在Postman中可以使用 Query Params 的方式添加参数: 也可以使用Body中的 form-data 的形式添加参数 一般用于传输DTO参数,只能有一

    2024年02月06日
    浏览(36)
  • ThreadPoolTaskExecutor中的execute()方法和submit()方法有什么区别?

    ThreadPoolTaskExecutor是Spring框架中的一个线程池实现,它提供了execute()和submit()两种方法用于启动异步任务。 execute()方法: 返回值类型为void; 接收一个Runnable类型的参数; 直接启动线程执行任务,不会返回一个Future对象; 如果任务抛出异常,线程池中的线程会捕获并记录异常

    2024年02月03日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包