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

Spring MVC-在控制器上设置初始化属性

钱志强
2023-03-14

我有一个Spring MVC,它使用一个外部库,我无法访问代码。此外部库使用标准system.get属性调用读取某些属性。我必须在使用服务之前设置这些值。

由于我的应用程序是SpringMVC应用程序,我不确定如何初始化这些属性。这是我到目前为止所做的,但由于某些原因,我认为这些值总是空的。

我将属性放在属性文件/conf/config中。属性

my.user=myuser
my.password=mypassowrd
my.connection=(DESCRIPTION=(LOAD_BALANCE=on)(ADDRESS=(PROTOCOL=TCP)(HOST=xxxx.xxxx.xxxx)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=xxx.xxx.xxx)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=myService)))

然后,我在我的应用程序中添加了以下两行ontext.xml

<context:annotation-config/>
<context:property-placeholder location="classpath*:conf/config.properties"/>    

我阅读了文档,为了设置初始化代码,可以实现InitializingBean接口,因此我实现了接口并实现了AfterPropertieSet()方法。

private static @Value("${my.user}") String username;
private static @Value("${my.password}") String password;
private static @Value("${my.connection}") String connectionString;  

@Override
    public void afterPropertiesSet() throws Exception {     
        System.setProperty("username",username);
        System.setProperty("password",password);
        System.setProperty("connectionString",connectionString);
    } 

问题是调用AfterPropertieSet()方法时,值总是为null。

  • 上述方法是否是初始化代码的正确方法,尤其是针对控制器?如果第二次呼叫控制器会发生什么

共有2个答案

容阳焱
2023-03-14

修补程序应该相当简单,只需从字段中删除静态修饰符,然后负责在带有@AuotWired@Value注释的字段中注入的AutoWiredAnnotationPost处理器将能够注入在正确的值和您的后面的属性设置应该被干净地调用

公冶谦
2023-03-14

您确定bean/控制器的定义与您的属性占位符定义所在的spring上下文配置文件相同吗?

看看Boris对这个问题的回答:@Controller类中的Spring@Value注释没有计算到属性文件中的值

如果您想将代码从控制器中移动,您可以添加一个组件,该组件在Spring完成初始化时监听代码,然后调用代码:

@Component
public class ApplicationStartedListener implements ApplicationListener<ContextRefreshedEvent> {

    private static @Value("${my.user}") String username;
    private static @Value("${my.password}") String password;
    private static @Value("${my.connection}") String connectionString;

    public void onApplicationEvent(ContextRefreshedEvent event) {
        System.setProperty("username",username);
        System.setProperty("password",password);
        System.setProperty("connectionString",connectionString);
    } 
}

 类似资料:
  • 我尝试加载一个FXML,并使用Java代码(而不是使用FXML标记)设置控制器。我在FXML中有不同的字段。我尝试加载(例如文本字段、按钮...)。 下面是一个例子: 如您所见,我创建了一个新的选项卡,为它设置文本,将它添加到tabpane,加载fxml,然后创建一个新的控制器,并将其设置为fxml的控制器。之后,我尝试在初始化之前在fxml中设置一个值,以便在控制器中使用它来更新文本字段或按钮。

  • 问题内容: 我想延迟控制器的初始化,直到从服务器收到必要的数据为止。 我找到了针对Angular1.0.1的解决方案:延迟AngularJS路由更改,直到加载模型以防止闪烁,但无法使其与Angular1.1.0一起使用 模板 ​ JavaScript http://jsfiddle.net/dTJ9N/1/ 问题答案: 由于$ http返回了promise,因此创建自己的deferred仅在htt

  • 问题内容: 如果您有一个控制器来操作Angular.js中的$ scope变量,是否有惯用的方法: 重置控制器的$ scope,然后 重新启动控制器初始化? 对于复杂的控制器,不必将每个变量都重置为其初始值将非常方便,特别是如果您真正想要的是对控制器和范围进行简单的重新初始化。通过再次导航到相同的URL 并没有帮助。 编辑:假设我不能使用任何黑客工具,因为这会违反Chrome打包应用中的CSP。

  • 问题内容: 我有一个AngularJs应用程序,我想在其中一开始就加载消息和应用程序版本,并将它们保存在本地存储中,然后再在控制器中使用它们。我现在所拥有的是每个控制器中的服务调用(目前为三个): 我只想获取一次应用程序版本并将其存储在此处。我不必每次都检查版本,对(如果新版本中添加了新消息)? 我发现使用$routeProvider的建议,但我的应用程序不是SPA。所以我需要其他想法/建议。对你

  • 我看了这个,这个,还有这个,但遗憾的是,没有一个能解决我的问题。组件总是空的。ID是一样的,但我仍然不知道我做错了什么。下面是我的代码: 应用类。 RootView.fxml 控制器类 应用程序运行正常。我错过了什么吗?

  • 问题内容: 我正在尝试使用redis-store作为我的Rails 3 cache_store。我也有一个initializer / app_config.rb,它加载一个yaml文件进行配置设置。在我的初始值设定项/redis.rb中,我有: 但是,这似乎不起作用。如果我做: 在我的Rails控制台中,我可以清楚地看到它正在使用 作为缓存存储而不是redis存储。但是,如果我像这样在我的appl