Spring MVC:从持久层全局注入属性

时间:2014-01-21 03:09:18

标签: java spring spring-mvc

我有一个服务bean,能够从持久层获取/设置属性值(例如:数据库)。像这样:

@Service
public ConfigService {
  public String getConfig(String key);
}

问题在于我写的每个控制器类,我必须自动装配并用属性键/值填充我的模型:

@Controller
@RequestMapping("/foo")
public FooController {
  @Autowired private ConfigService configService;

  @RequestMapping("/login")
  public String login(Model model) {
    model.addAttribute("site.name", configService.getConfig("site.name"));
    //...
  }
}

有没有什么方法可以在我的spring JSP视图中自动获取此属性的值?对于我编写的每个控制器类,我不想将其注入我的模型对象。

我到目前为止最接近的是使用Spring ResourceBundleMessageSource bean和<spring:message>标签,但是我被限制使用属性文件,无法将其存储在数据库中。

1 个答案:

答案 0 :(得分:0)

我找到了另一种方法。使用@ControllerAdvice类结合@ModelAttribute方法。像这样:

@ControllerAdvice
public class ConfigAdvice {
  @Autowired private ConfigService configService;

  @ModelAttribute
  public void populateConfig(Model model) {
    for(Config config : configService.getAll()) {
      model.addAttribute(config.getKey(), config.getValue());
    }
  }
}

上面的@ModelAttribute带注释的populateConfig()方法将在所有其他控制器类的任何@RequestMapping方法之前运行。

一个缺点是配置密钥不能包含任何点字符。

到目前为止,这似乎是我最好的选择。如果有更好的方法,请告诉我。