@Controller类中的Spring @Value注释不评估属性文件中的值

Chr*_*ris 54 spring properties

我是Spring的新手,并尝试使用带@Value("${loginpage.message}")注释注释的控制器内部的注释注入一个@Controller值,并且我的字符串的值被评估为字符串"${loginpage.message}"而不是我的属性文件中的内容.

下面是我的控制器,我想要注入字符串'message'.

@Controller
public class LoginController extends BaseController {
    @Value("${loginpage.message}")
    private String message;

    @RequestMapping("/")
    public String goToLoginPage(Model model) {
        model.addAttribute("message", message);

        return "/login";
    }
}
Run Code Online (Sandbox Code Playgroud)

我的应用程序上下文如下所示:

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

<context:annotation-config />

<context:component-scan base-package="com.me.application" />
Run Code Online (Sandbox Code Playgroud)

我的属性文件有以下行:

loginpage.message=this is a test message
Run Code Online (Sandbox Code Playgroud)

Spring必须在某个时刻获取值,因为每当我更改@Value("${loginpage.message}")为不在属性文件中的值时@Value("${notInPropertiesFile}"),我都会得到异常.

Bor*_*hov 66

似乎问题已经被问到Spring 3.0.5没有从属性中评估@Value注释

Web应用程序根目录和servlet应用程序上下文之间的区别是Spring中混淆的主要原因之一,请参阅 Spring Framework中applicationContext.xml和spring-servlet.xml之间的区别

来自@Valuejavadoc:

请注意,@ Value注释的实际处理由BeanPostProcessor执行

Spring文档:

BeanPostProcessor接口的范围是每个容器.这仅在您使用容器层次结构时才有意义.如果在一个容器中定义BeanPostProcessor,它将只对该容器中的bean执行操作.在一个容器中定义的Bean不会被另一个容器中的BeanPostProcessor进行后处理,即使两个容器都是同一层次结构的一部分.

  • 谢谢,这很有效.我必须将`<context:property-placeholder location ="classpath:properties/application.properties"/>`添加到dispatcher-servlet.xml,并且它现在能够从属性文件中读取. (11认同)
  • 如果有人试图在类构造函数中访问这些属性,请记住您不能,因为它们尚未连接.你应该实现InitializingBean :: afterPropertiesSet (5认同)

tn.*_*low 7

是的,我在Spring 3中遇到了同样的问题.它似乎不适用于Controllers.为了解决这个问题,我用@Service创建了另一个bean并将其注入控制器.它对我有用.希望这会对某人有所帮助,因为我花了一整天时间来弄明白.