在spring mvc中创建和访问属性文件

时间:2012-11-16 16:39:46

标签: spring-mvc

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;
    }



}

Another site where I found the explanation

2 个答案:

答案 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注入控制器。

    • bean id =“testController”class =“com.app.springhr.TestController”
    • beans: property name =“messageSource”ref =“messageSource
  • 在控制器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”

    • 希望这有助于其他人