首页 > 其他分享 >Controller 中的请求方法,private 和 public有什么区别?别用错了!

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

时间:2023-10-27 10:12:07浏览次数:35  
标签:service private testA Controller Aop hinotoyk 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开发手册(嵩山版)》最新发布,速速下载!

觉得不错,别忘了随手点赞+转发哦!

标签:service,private,testA,Controller,Aop,hinotoyk,public
From: https://www.cnblogs.com/javastack/p/17791137.html

相关文章

  • 在Java中,public、protected、包私有(package-private)和私有(private)之间的区别是什么?
    内容来自DOChttps://q.houxu6.top/?s=在Java中,public、protected、包私有(package-private)和私有(private)之间的区别是什么?在Java中,在使用class和interface以及处理继承时,是否有明确的规定何时使用每个访问修饰符,即默认(包私有)、public、protected和private?官方教程(http://doc......
  • odoo fileupload via controller
      #-*-coding:utf-8-*-#PartofOdoo.SeeLICENSEfileforfullcopyrightandlicensingdetails.importbase64fromcollectionsimportOrderedDictfromdatetimeimportdatetimefromodooimporthttpfromodoo.exceptionsimportAccessError,Missin......
  • odoo controller
    一:Controller  一般通过继承的形式来创建controller类,继承自odoo.http.Controller。  以route装饰器来装饰定义的方法,提供url路由访问路径:classMyController(odoo.http.Controller)://继承controller定义控制器@route('/some_url',auth='public')//装饰器路由访问方......
  • @Controller和@RestController的区别
    总体上,@Controller和@RestController都是SpringMVC框架中的注解,用于标识一个类是SpringMVCcontroller处理器,可以接收HTTP请求。但它们在处理请求和返回结果方面存在一些不同。返回类型:@Controller:如果使用@Controller注解,那么类中的方法可以直接通过返回String跳转到jsp、......
  • laravel:中间件给controller传递参数(10.27.0)
    一,相关文档https://learnku.com/docs/laravel/10.x/middleware/14846二,php代码1,middleware12345678910111213141516171819202122232425<?php namespaceApp\Http\Middleware; useClosure;useIlluminate\Http\Request;useS......
  • Flutter的Invalid use of a private type in a public API警告
    问题描述自己在写Flutter应用时发现了一个InvaliduseofaprivatetypeinapublicAPI警告。发现很多官方的例子也有这个问题。有问题的源码有问题的源码如下:classMyTabPageextendsStatefulWidget{constMyTabPage({super.key});@override_MyTabPageState......
  • 一个更复杂的 PHP 代码示例,我将展示一个购物车系统的基本实现,它包括商品类、购物车类
    一个更复杂的PHP代码示例,我将展示一个购物车系统的基本实现,它包括商品类、购物车类和一些基本的操作方法。<?php//定义商品类classProduct{private$name;private$price;publicfunction__construct($name,$price){$this->name=$name;$this->pri......
  • System.TypeLoadException:“程序集“XXXX.K3.SCM.App.Core, Version=1.0.0.0, Cultur
    一、问题描述:网站页面调用方法时报错:报错内容如下:System.TypeLoadException:“程序集“XXXX.K3.SCM.App.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中的类型“XXXX.K3.SCM.App.Core.StockService”的方法“WriteBackAfterByInWhenAudit”没有实现。”......
  • Nest.js Controller 解析:探索路由和请求处理的强大功能
    Controller 它主要是负责特定路由请求处理并将响应结果返回给客户端。每个控制器它会有多个路由,不同路由对应不同的业务请求处理。在Nest 中,创建一个控制器,应该使用类和装饰器,装饰器会使类相关联的数据的关联起来,将请求绑定到相应的控制器。可以使用Nest-cli提供的......
  • private、 protected、 public、 internal 修饰符的访问权限
    private:私有成员,在类的内部才可以访问。protected:保护成员,该类内部和继承类中可以访问。public:公共成员,完全公开,没有访问限制。internal:当前程序集内可以访问......