如何使用 Spring Boot 在控制器中注入 bean?

Posted

技术标签:

【中文标题】如何使用 Spring Boot 在控制器中注入 bean?【英文标题】:How can i inject a bean in my controller using spring boot? 【发布时间】:2019-01-18 03:50:02 【问题描述】:

我尝试了@Autowired,但它不起作用。

这是我的豆子:

@Bean(name = "getModels")
public JSONObject getModels() throws ClassNotFoundException 
    return scannerService.getModels(Test.class , Pc.class);

还有我的控制器

@RequestMapping(value = "/classes", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public String getAdminParams() throws JSONException, ClassNotFoundException 

    ApplicationContext context = new 
    AnnotationConfigApplicationContext(CreateModels.class);
    CreateModels createModels = (CreateModels) context.getBean("getModels");

    return createModels.toString() ;

【问题讨论】:

这在很多方面都是错误的......我建议看一个简单的春季教程 你能告诉scannerService类吗? 永远不要创建新的应用程序上下文。 准确地告诉我们您尝试了什么(使用相关代码),并准确地告诉我们它是如何不起作用的。不过,我很难理解为什么你认为这个 JSONObject 应该是一个 bean。 @Lino 对吗?我不知道从哪里开始....首先,您是否遇到任何错误? scannerService 类返回什么?为什么是bean类型JSONObject和自动装配对象类型CreateModels 我有一个返回 jsonObject 的 bean,我想在我的控制器中使用这个 bean,我该怎么做? 【参考方案1】:

这可能是您应该已经创建和使用 bean 的方式:

@Service
public class ModelService // or whatever
    private final ScannerService scannerService;

    @Autowired
    public ModelService(ScannerService scannerService)
        this.scannerService = scannerService;
    

    public JSONObject getModels() throws ClassNotFoundException
        return scannerService.getModels(Test.class, Pc.class);
            

然后在您的控制器中,注入 ModelService(或您提供的名称):

// your annotations
public class Controller // your name
    private final ModelService modelService;

    public Controller(ModelService modelService)
        this.modelService = modelService;
    

    @RequestMapping(value = "/classes", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    public String getAdminParams() throws JSONException, ClassNotFoundException
        return modelService.getModels().toString();
    

这当然只是一个示例,您必须对其进行调整以适用于您当前的代码。但通常提供一个值(例如来自scannerService.getModels() 的结果)作为@Bean 是一个非常糟糕的主意。更好的解决方法是创建一个持有者对象。

【讨论】:

是的,但是我想在应用程序启动时加载我的 json 对象,这就是我将其设为 bean 的原因,并且我想在我的控制器中使用这个 jsonObject。所以每次我想使用我的 jsonObject 时发出请求并不是一个好主意【参考方案2】:

我解决了

有豆子

@Bean("models")
public JSONObject getModels() throws ClassNotFoundException 

    return scannerService.getModels(Test.class , Pc.class);

然后我将它注入我的控制器中

@Autowired
@Qualifier("models")
JSONObject models;

【讨论】:

以上是关于如何使用 Spring Boot 在控制器中注入 bean?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 中创建一个调用包含构造函数注入的服务的测试?

如何在 Spring Boot 测试中获取正在运行的服务器端口?

spring boot 测试无法注入 TestRestTemplate 和 MockMvc

多部分表单数据输入 Java 模型属性未在请求类中注入元素 - Spring Boot

Spring boot 读取 application.properties 文件方法

Spring-Boot 如何正确注入 javax.validation.Validator