Spring Roo&阅读属性文件

时间:2015-09-05 16:10:03

标签: java spring-mvc spring-roo properties-file

我想在Spring Roo项目中阅读一个简单的属性文件。似乎很容易,但是我已经挣扎了半天以上,我需要寻求帮助。

我在互联网上阅读了很多问答,但我无法让它发挥作用。 我查看了Properties with SpringSpring @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";
    }
}

2 个答案:

答案 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());

        ...
        ...

再次感谢您的帮助!