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

Spring:如何从模型类中的属性文件中获取值

仉宸
2023-03-14

我在项目中使用SpringMVC。我有一些常量值存储在属性文件中,我想从属性文件中获取。问题我无法从属性文件中获取模型类中的值。它正在变为空。

我已经设置属性文件位置在servlet-context.xml

 <context:property-placeholder location="classpath:myproperties.properties" />

现在,通过使用@Value注释,我从属性文件中注入了值。

@Component
class ModelTest {

     @Value("${fname}")
     private String fname;

     // Default Constructor
     public ModelTest(){
          Sysout(fname);      // getting null here
     }

     @PostConstruct
     public void initMembers(){
          Sysout(fname)      // Prints fname value properly    
     }

     public void setFname(String fname){
          this.fname=fname;
     }

     public String getFname(){
          return fname;
     }

     @Override
     public String toString() {
          Sysout(fname);
          return "ModelTest [variableFirst=" + variableFirst + "]"; 
     }
}

这是ServiceTest类。

@Service
class ServiceTest(){

    @Value("${fname}")
    private String fname;

    public String printTest(){
         sysout(fname);           // Prints fname value
         return new ModelTest().toString() // Prints null
    }
}

这里是ControllerHome类:

@Controller
public class ControllerHome {

     @Value("${fname}")
     private String fname;

     @Autowired
     private ServiceTest service;

     @RequestMapping("/")
     public @ResponseBody String printData(){
          sysout(fname);           // Prints fname value
          return service.printTest();  // Print null
     }
}

在模型类fname是获得null而在控制器和服务类值来正确。

有人面临这样的问题吗?

共有2个答案

司易安
2023-03-14

我是这样做的:

@Component
@PropertySource("classpath:myproperties.properties") // <-Add this.
class ModelTest {

     @Autowired
     private Environment env; 

     public void test(){
        String name = env.getProperty("name"); //Assuming you have a 'name' key in your myproperties.property
     }
}
谭献
2023-03-14

当您说模型类时,您是指传递给控制器方法的值,该值由@modeldattribute指示吗?

如果是这样,该类是通过反射的普通构造函数调用创建的。它不是一个Spring bean,因此@Value什么都不做。

关于你的编辑,我认为对Spring的工作方式有一些根本性的误解。

@Service
class ServiceTest(){

    @Value("${fname}")
    private String fname;

    public String printTest(){
        sysout(fname);           // Prints fname value
        // Calling new here means Spring does nothing
        // ModelTest is not a Spring bean
        // `@Component`, `@PostConstruct` and `@Value` in ModelTest mean nothing.
        return new ModelTest().toString() // Prints null
    }
}

相反,您必须这样做:

@Service
class ServiceTest(){

    @Value("${fname}")
    private String fname;

    @Autowired
    private ModelTest modelTest;

    public String printTest(){
        sysout(fname);           // Prints fname value
        // modelTest is now a Spring bean
        return modelTest.toString() // Should not print null
    }
}

现在,Spring将创建ModelTest,并且@组件@PostConstruct@值将由Spring执行。

但是,@Component本身有一个默认的单例作用域。因此,您将始终使用相同的modelTest

所以,你必须做这样的事情:

@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
class ModelTest {
    // ...
}

现在,虽然ServiceTest中的modelTest引用将保持不变,但使用代理将把方法调用转移到Spring根据请求创建的modelTest的新实例。

 类似资料:
  • 问题内容: 抱歉,这似乎是一个简单的问题,但是我已经开始对此进行讨论了…… 我有一个看起来像这样的XML文件… 我正在尝试获取 VarNum 。 到目前为止,我已经成功使用以下代码来获取其他信息: 我只是无法获取VarNum(我认为是属性值?) 谢谢! 问题答案: 您应该可以使用SimpleXMLElement ::attributes()来获得它 尝试这个: 这将为您显示第一个元素的所有名称/值

  • 我正在尝试为我的sping-boot应用程序设置测试。在常规执行中,我从. env文件中获取一些值,这些值是我在运行配置中指定的,如下所示: 但当我尝试运行最简单的测试时,它会失败,但有一个例外: 加载Application Contextjava.lang.IllegalStateException失败:加载Application Context失败………原因:org.springframewo

  • 我有一个实用工具类,其中我有一个方法,它需要用户名和密码来连接其他URL。我需要将用户名保存在属性文件中,这样我就可以随时更改它。但当我在静态方法中使用它(作为实用程序类)时,问题是它显示为空(即它不能从属性文件中读取)。 但当我在其他控制器中输入这些值时,它们就会到达那里。所以我的问题是如何读取静态字段中的属性值

  • 我试图只使用注释创建Spring bean。我无法从属性文件加载@Bean类的值。 下面是我的代码: 知道我做错了什么吗?

  • 问题内容: 该问题的可接受答案描述了如何在类中创建的实例。这涉及将参数传递给构造函数并从中调用方法。 然后创建的新实例,并传递参数。 如果新类的泛型类型参数不是某个已知类,但它本身是泛型类型参数,该怎么办?假设我还有其他班级,我想从该班级内部创建一个新实例。然后,如果尝试传递,则会收到以下编译器错误: 有没有办法解决? 对我来说触发错误的代码是: 发生错误,是因为我不会写。还有其他传递相同信息的方

  • 这个问题的公认答案描述了如何在类中创建的实例。这涉及将参数传递给构造函数,并从中调用方法。 然后创建的新实例,并传入参数。 对我来说,触发错误的特定代码位是: 错误发生,因为我不能编写。还有其他方式传递同样的信息吗?