我想在Spring Roo项目中阅读一个简单的属性文件。似乎很容易,但是我已经挣扎了半天以上,我需要寻求帮助。
我在互联网上阅读了很多问答,但我无法让它发挥作用。 我查看了Properties with Spring和Spring @PropertySource example。 我是春天的新手,所以请耐心等待。
My Spring版本是3.2.8
问题: 如何在BaseController类中检索test.name键值。
我创建了一个非常简单的Spring Roo应用程序来说明我的所作所为。
我的Roo脚本:
// Create a new project
project --topLevelPackage com.springsource.pizzashop --projectName pizzashop
// Setup JPA persistence using EclipseLink and H2
jpa setup --provider HIBERNATE --database HYPERSONIC_IN_MEMORY
// Create domain entities
entity jpa --class ~.domain.Base
field string --fieldName name --sizeMin 2 --notNull
// Adding web layers
web mvc setup
web mvc all --package ~.web
默认情况下,我的" applicationContext.xml":
<context:property-placeholder location="classpath*:META-INF/spring/*.properties"/>
我没有更改此文件。所以我没有添加豆子。
我在..resources \ META-INF \ spring \文件夹中添加了test.properties文件,该文件位于data.properties旁边。
test.name=Google
test.url=www.google.com
我在base.java类文件旁边的... \ java \ com \ springsource \ pizzashop \ domain \ PizzaProperties.java中为配置文件添加了一个Java bean。
package com.springsource.pizzashop.domain;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.roo.addon.javabean.RooJavaBean;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
@RooJavaBean
@PropertySource("classpath:META-INF/spring/test.properties")
public class PizzaProperties {
@Value("${test.name}")
private String name;
@Value("${test.url}")
private String url;
}
当然&#34; PizzaProperties_Roo_JavaBean.aj&#34;也是由getter和setter创建的。
找到属性文件,因为当我将名称更改为test1.properties时,出现错误。
我推入了Base.list方法来测试我是否能够读取属性文件。在方法中,我做了一个System.out.println。 结果总是:
在Base.list中 Name = null
package com.springsource.pizzashop.web;
import com.springsource.pizzashop.domain.Base;
import com.springsource.pizzashop.domain.PizzaProperties;
import org.springframework.roo.addon.web.mvc.controller.scaffold.RooWebScaffold;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@RequestMapping("/bases")
@Controller
@RooWebScaffold(path = "bases", formBackingObject = Base.class)
public class BaseController {
@RequestMapping(produces = "text/html")
public String list(@RequestParam(value = "page", required = false) Integer page, @RequestParam(value = "size", required = false) Integer size, @RequestParam(value = "sortFieldName", required = false) String sortFieldName, @RequestParam(value = "sortOrder", required = false) String sortOrder, Model uiModel) {
System.out.println("In Base.list");
PizzaProperties config = new PizzaProperties();
System.out.println("Name = " + config.getName());
if (page != null || size != null) {
int sizeNo = size == null ? 10 : size.intValue();
final int firstResult = page == null ? 0 : (page.intValue() - 1) * sizeNo;
uiModel.addAttribute("bases", Base.findBaseEntries(firstResult, sizeNo, sortFieldName, sortOrder));
float nrOfPages = (float) Base.countBases() / sizeNo;
uiModel.addAttribute("maxPages", (int) ((nrOfPages > (int) nrOfPages || nrOfPages == 0.0) ? nrOfPages + 1 : nrOfPages));
} else {
uiModel.addAttribute("bases", Base.findAllBases(sortFieldName, sortOrder));
}
return "bases/list";
}
}
答案 0 :(得分:3)
要允许Spring注入属性必须是Spring如何创建Bean。
试试这个:
添加到PizzaProperties
@Bean
注释(@RooJavaBean
只生成 getters 和 setters )
...
...
@RooJavaBean
@Component
@PropertySource("classpath:META-INF/spring/test.properties")
public class PizzaProperties {
...
...
为BaseController
添加@Autowired
PizzaProperties
个媒体资源:
...
...
@RequestMapping("/bases")
@Controller
@RooWebScaffold(path = "bases", formBackingObject = Base.class)
public class BaseController {
@Autowired
private PizzaProperties config;
@RequestMapping(produces = "text/html")
public String list(@RequestParam(value = "page", required = false) Integer page, @RequestParam(value = "size", required = false) Integer size, @RequestParam(value = "sortFieldName", required = false) String sortFieldName, @RequestParam(value = "sortOrder", required = false) String sortOrder, Model uiModel) {
System.out.println("In Base.list");
System.out.println("Name = " + config.getName());
...
...
请注意,所有这些只是Spring配置,而不是特殊的Spring Roo。
祝你好运!答案 1 :(得分:0)
jmvivo当然让我走上正轨。
稍微更新了我最终如何以一种非常简单,干净的方式在Spring Roo项目中读取属性文件。
1)在属性类中只有@RooJavaBean和@Component就足够了!不需要@PropertySource,也不需要添加@Bean。
可能是因为<context:property-placeholder location="classpath*:META-INF/spring/*.properties"/>
,不需要使用@PropertySource注释。
2)由于jmvivo表示我必须添加
@Autowired
private PizzaProperties config;
到我想要使用属性的类。
所以最后它非常简洁。我喜欢保持KIS。
package com.springsource.pizzashop.domain;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.roo.addon.javabean.RooJavaBean;
import org.springframework.stereotype.Component;
@RooJavaBean
@Component
//@PropertySource("classpath:META-INF/spring/test.properties")
public class PizzaProperties {
@Value("${test.name}")
private String name;
@Value("${test.url}")
private String url;
}
和
@RequestMapping("/bases")
@Controller
@RooWebScaffold(path = "bases", formBackingObject = Base.class)
public class BaseController {
@Autowired
private PizzaProperties config;
@RequestMapping(produces = "text/html")
public String list(@RequestParam(value = "page", required = false) Integer page, @RequestParam(value = "size", required = false) Integer size, @RequestParam(value = "sortFieldName", required = false) String sortFieldName, @RequestParam(value = "sortOrder", required = false) String sortOrder, Model uiModel) {
System.out.println("In Base.list");
System.out.println("Name = " + config.getName());
...
...
再次感谢您的帮助!