我在项目中使用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而在控制器和服务类值来正确。
有人面临这样的问题吗?
我是这样做的:
@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
}
}
当您说模型类时,您是指传递给控制器方法的值,该值由@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类的值。 下面是我的代码: 知道我做错了什么吗?
问题内容: 该问题的可接受答案描述了如何在类中创建的实例。这涉及将参数传递给构造函数并从中调用方法。 然后创建的新实例,并传递参数。 如果新类的泛型类型参数不是某个已知类,但它本身是泛型类型参数,该怎么办?假设我还有其他班级,我想从该班级内部创建一个新实例。然后,如果尝试传递,则会收到以下编译器错误: 有没有办法解决? 对我来说触发错误的代码是: 发生错误,是因为我不会写。还有其他传递相同信息的方
这个问题的公认答案描述了如何在类中创建的实例。这涉及将参数传递给构造函数,并从中调用方法。 然后创建的新实例,并传入参数。 对我来说,触发错误的特定代码位是: 错误发生,因为我不能编写。还有其他方式传递同样的信息吗?