当前位置: 首页 > 知识库问答 >
问题:

Spring Boot没有注入web感知范围的Bean

花阳辉
2023-03-14

如果我尝试用web感知范围(即会话范围、请求范围)注入bean,那么注入器会忽略该bean。未调用bean方法和对象构造函数。这只发生在我声明的类上,因为我可以为标准库类型(如List或Map)注入会话范围的bean。此外,如果我使用单例或原型作用域,则注入工作正常。

有人能解释这种奇怪的行为吗?我创建了一个准系统样本来演示这个问题。(我也尝试搜索,但找不到遇到此问题的任何人。

我想注入的类

public class CustomObj{
    public String field;

    public CustomObj(){
        System.out.println("CustomObj constructor called");
    }
}

配置文件

@Configuration
public class Config {

    @Bean
    @Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
    public List<String> userValues() {
        List<String> list = new ArrayList<String>();
        list.add("This gets initialized");
        return list;
    }

    @Bean
    @Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
    public CustomObj customObj() {
        CustomObj obj = new CustomObj();
        obj.field = "This doesn't";
        return obj;
    }
}

注入对象的控制器

@RestController
@RequestMapping("/test")
public class TestController{

    @Autowired
    List<String> userValues;

    @Autowired
    CustomObj customObj;

    @RequestMapping("/pleasework")
    public String please(){
        return "List values: "+Arrays.toString(this.userValues.toArray())
            + " Obj value: "+this.customObj.field;
    }
}

主要的

@SpringBootApplication
public class SessionbeansApplication {

    public static void main(String[] args) {
        SpringApplication.run(SessionbeansApplication.class, args);
    }

}

访问/test/pleasework会输出<code>List values:〔This gets initialized〕Obj value:null</code>,表明List注入正确,但CustomObj没有注入。

共有1个答案

颛孙嘉石
2023-03-14

如果您运行代码,输出将类似于列表值:[This gets initialized]对象值:null

您没有得到NullpoiterException,这意味着您的CustomObjbean已创建

您应该在自定义对象中使用getter和setter。并使用getter访问字段:this.customObj.get字段();

    @RequestMapping("/pleasework")
    public String please(){
        System.out.println(userValues +  " and " + customObj);
        return "List values: "+ Arrays.toString(this.userValues.toArray())
                + " Obj value: " + this.customObj.getField();// <--- use getter
    }

在< code>CustomObj中添加< code>toString()也可以

class CustomObj {
    public String field;

    public CustomObj(){
        System.out.println("CustomObj constructor called");
    }

    @Override
    public String toString() {
        return "CustomObj{" +
                "field='" + field + '\'' +
                '}';
    }
}

....

  @RequestMapping("/pleasework")
    public String please(){
        System.out.println(userValues +  " and " + customObj);
        return "List values: "+ Arrays.toString(this.userValues.toArray())
                + " Obj value: " + this.customObj; //<---- use toString()
    }

 类似资料:
  • 问题内容: 假设有一个与此问题类似的情况。我想得到以下结果: 我可以使用选定的答案作为解决方案: 我如何确保即使在该范围内没有任何结果,也将显示30-39的分数范围? 问题答案: 尝试以下查询(也在SQL Fiddle上): 编辑: 您可以通过将参数更改为轻松调整范围。可以使用以下构造来确保始终覆盖您的分数: 对于CTE。

  • 如果我有一个Web应用程序,它的应用程序上下文加载了我的webapp和所有作业配置文件的所有内容,如果我的作业中有一个没有范围="步骤"的简单ItemReader,那么阅读器是单例的,对吗?所以如果我通过SimpleJobLauncher从控制器启动两次作业,我会使用同一个bean,对吗?除非我放入范围="步骤",以便每个作业执行一个bean? 另一方面,如果我从CommandLineJobRun

  • 我正在使用不同作用域的bean开发一个Spring应用程序。许多bean是单例的,有其他请求或自定义的作用域。特别是,使用这些自定义作用域有时很难找出哪个作用域可以安全地注入到其他作用域中,或者何时需要使用。 我知道我可以为所有基本上不是单例的bean创建范围代理,但在许多情况下,这似乎是不必要的。例如,一个bean可能只应该被注入到相同范围的其他bean,但并不是每个在项目中工作的人都知道这一点

  • 我定义了同一个类的两个bean: 和另一个原型作用域bean: Spring应用程序上下文是否可能在没有可用请求时自动注入正确的bean?我希望在web上下文(例如在controller中)中获取bean时被注入,并希望在没有web上下文时被注入(例如,当我通过Quartz调度器运行一些代码时)。 我非常希望坚持使用的一个bean定义,因为将有许多不同的bean需要类似的行为,因此在我的情况下使用

  • 我正在使用 Spring 3.1.1,在我的业务逻辑中,我有一个循环,每次迭代都需要一个新的 Spring bean(原型范围)实例。 最好的方法是什么?我是否必须创建自己的 BeanFactory 类,我可以将其注入一次到我的类中,并且每次都调用它来生成 bean?在查看 Spring 3 文档时,它似乎暗示我应该改用 ApplicationContext。但是,使用ApplicationCon

  • 我们知道Spring框架提供了单例、原型、请求、会话、全局会话bean范围。 我们还知道Spring Web流提供了flow Scope、viewScope、Request estScope、flash Scope、versationScope。 因此,如果我在spring MVC项目中提到一个组件,比如说Student,作为@Component@Scope=singleton。对于每个请求,它会