为了账号安全,请及时绑定邮箱和手机立即绑定

弹簧自动布线“忘记”依赖关系

弹簧自动布线“忘记”依赖关系

慕虎7371278 2022-08-17 10:58:58
我想玩一下不同类型的bean示波器。所以我写了一个测试环境,它应该生成一个随机数,这样我就可以看到一个bean是否发生了变化。我的测试设置不起作用,我无法解释我发现的内容。我正在使用Spring Boot 2.13和Spring Framework 5.15。以下设置:主类:package domain.webcreator;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class WebcreatorApplication {    public static void main(String[] args) {        SpringApplication.run(WebcreatorApplication.class, args);    }}豆类:package domain.webcreator;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.util.Random;@Configurationpublic class Beans {    @Bean    public Random randomGenerator() {        return new Random();    }}作用域器类:package domain.webcreator;import org.springframework.context.annotation.Scope;import org.springframework.stereotype.Service;import java.util.Random;@Service@Scope("singleton")public class Scoper {    private Random rand;    public Scoper(Random rand) {        this.rand = rand;    }    public int getNumber(int max) {        return rand.nextInt(max);    }}索引控制器package domain.webcreator.controller;import domain.webcreator.Scoper;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.ResponseBody;@Controllerpublic class IndexController {    @GetMapping("/")    @ResponseBody    @Autowired    public String indexAction(Scoper scoper) {        return String.valueOf(scoper.getNumber(50));    }}我的问题是,我在调用 scoper.getNumber(50) 时得到了一个 NPE。这很奇怪,因为在调试时,会生成一个 Random Bean 并将其传递给作用域器构造函数。稍后,在控制器中,rand 属性为 null。
查看完整描述

1 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

你试图应用一个随机的方法,这不是Spring的工作方式。控制器方法参数用于特定于该HTTP请求的信息,而不是一般依赖项,因此Spring正在尝试创建一个与请求关联的新参数 - 但它在请求中没有任何要填写的传入值。@AutowiredScoper


相反,请在构造函数中传递您的构造函数。Scoper


@RestController

public class IndexController {

    private final Scoper scoper;


    public IndexController(Scoper scoper) {

        this.scoper = scoper;

    }


    @GetMapping("/")

    public String indexAction(Scoper scoper) {

        return String.valueOf(scoper.getNumber(50));

    }

}

一些注意事项:

  • 单例作用域是默认值,无需指定它。

  • @RestController比重复更可取,除非您有一个混合的控制器类。@ResponseBody


查看完整回答
反对 回复 2022-08-17
  • 1 回答
  • 0 关注
  • 70 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号