[英]Spring Roo & reading property file
我想在Spring Roo项目中读取一个简单的属性文件。 看起来很简单,但是经过了超过半天的努力,我需要寻求帮助。
我在互联网上阅读了许多问答,但我无法使其正常工作。 我用Spring和Spring @PropertySource示例查看了Properties 。 我是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文件,该文件也位于其中的database.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;
}
当然,还将创建具有getter和setter的“ PizzaProperties_Roo_JavaBean.aj”。
找到属性文件,因为当我将名称更改为test1.properties时,出现错误。
我推入Base.list方法来测试是否能够读取属性文件。 在该方法中,我执行System.out.println。 结果始终是:
在Base.list中
名称=空
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";
}
}
要允许Spring注入属性,必须是Spring如何创建Bean。
尝试这个:
添加到PizzaProperties
@Bean
批注( @RooJavaBean
只是生成getter和setter )
...
...
@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东西。
祝好运!
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());
...
...
再一次感谢你的帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.