read this article on SO,并提出了一些澄清问题。
我将config.properties放在src / main / resources
下在spring-servlet.xml config file
我添加了以下内容:
<context:property-placeholder location="classpath:config.properties"/>
在我的业务层中,我试图通过
访问它@Value("${upload.file.path}")
private String uploadFilePath;
Eclipse显示错误:
The attribute value is undefined for the annotation type Value
我是否可以访问业务层中的属性,或者只能在控制器中读取属性文件?
UPDATE :: 的src /主/爪哇/ com.companyname.controllers / homecontroller.java
public String home(Locale locale, Model model) {
MyServiceObject myObj = new MyServiceObject();
System.out.println("Property from my service object: = " + myObj.PropertyValue());
if(myObj.PerformService())
{
///
}
}
的src /主/爪哇/ com.companyname.services / MyService.java
public class MyServiceObject {
@Value("${db.server.ip}")
private String _dbServerIP;
public String PropertyValue() {
return _dbServerIPaseURL;
}
}
答案 0 :(得分:0)
请检查您从org.springframework.beans.factory.annotation包导入值:
import org.springframework.beans.factory.annotation.Value;
还必须在相应的上下文配置文件中声明属性占位符,如果是控制器,则可能是Spring调度程序servlet配置文件。
更新您混淆property-placeholder
后处理bean值,其中包含美元符号${<property name>}
和Spring expression language container extension处理包含哈希符号{{1}的值在您显示的链接中,使用了后一种方法。
关于MyServiceObject myObj的实例化 如果您希望对象由Spring管理,您应该将其创建委托给容器:
如果#{<Spring expression language expression>}
是无状态服务,那么它是具有单例bean范围的单例,您应该在应用程序上下文中注册它,例如使用以下xml配置:
MyServiceObject
并将其注入您的控制器:
<bean class="my.package.MyServiceObject"/>
如果需要private MyServiceObject myServiceObject;
@Autowired
public void setMyServiceObject(MyServiceObject myServiceObject){
this.myServiceObject = myServiceObject;
}
的许多实例,则可以将其声明为具有其他(非单例)bean范围(例如原型或请求)的bean。
但是,因为只有一个控制器实例,所以不能让Spring容器将MyServiceObject
实例自动装配到控制器字段,因为只有一个字段和许多MyServiceObject
类实例。您可以在the respective section of the documentation中阅读有关解决此问题的不同方法(针对不同的bean范围)。
答案 1 :(得分:0)
这是一种允许我们从属性文件中获取所需值的方法。这可以是Java代码(Controller类)或JSP。
创建属性文件WEB-INF / classes / messageSource.properties 它将位于类路径中,并且可以在控制器和JSTL中访问。 与任何属性文件一样,这个属性文件由键和值
组成例如:
hello = Hello JSTL,Hello Contoller
对于控制器
找到用于定义Spring bean的xml文件。在我的例子中,它被命名为servlet-context.xml。您可能需要通过在使用servlet contextConfigLocation属性的情况下查看web.xml来确定。
使用id =“messageSource”添加新的Spring bean定义。 Spring将在运行时使用属性文件键值对加载此bean。使用以下属性创建bean:
bean id =“messageSource”
class = org.springframework.context.support.ReloadableResourceBundleMessageSource
property name =“basename”value =“WEB-INF / classes / messageSource
在控制器类(testController)的bean定义文件中,将messageSource添加为属性。这会将messageSource bean注入控制器。
在控制器JAVA类中,添加messageSource Spring Bean字段及其getter和setter。请注意,字段类型是ReloadableResourceBundleMessageSource。
private org.springframework.context.support。 ReloadableResourceBundleMessageSource messageSource;
public org.springframework.context.support。 ReloadableResourceBundleMessageSource getMessageSource(){ return messageSource; }
public void setMessageSource( org.springframework.context.support。 ReloadableResourceBundleMessageSource messageSource){ this.messageSource = messageSource; }
在您的控制器代码中,您现在可以从捆绑包中获取任何已知的属性值。
String propValue = getMessageSource()。getMessage(“hello”,objArray,null);
使用JSTL
由于属性文件messageSource.properties位于类路径中,因此JSTL将能够找到它并获取给定键的值。
添加fmt taglib的导入
taglib uri =“http://java.sun.com/jsp/jstl/fmt”prefix =“fmt”
使用JSP中的fmt:标记从属性文件中获取值。
抱歉伪语法,这个编辑器似乎不呈现任何XML。
fmt:bundle basename =“messageSource”
fmt:message key =“hello”
希望这有助于其他人