如何在Spring中使用@PropertySource加载的属性文件中配置“动态密钥”

时间:2015-10-12 19:44:52

标签: java spring

使用Spring 4 @Configuration注释,这是我配置属性文件并在我的应用程序中引用的方式:

的src /主/资源/ errors.properties

name.empty.error=name is empty
department.empty.error=department is empty

Java代码配置和用法:

@Configuration
@PropertySource("classpath:errors.properties")
public class Sample {
    @Autowired
    private Environment env;

    public void usage() {
        String errorText = env.getProperty("name.empty.error");
    }

我想以下列方式指定我的errors.properties的'key':

{0}.empty.error={0} is empty

以便usage()方法可以调用类似

的方法
String errorText1 = env.getProperty("{}.empty.error", "name");
String errorText2 = env.getProperty("{}.empty.error", "department");

怎么做?我记得在Struts错误消息处理中存在类似的东西。

3 个答案:

答案 0 :(得分:1)

您需要使用MessageSource,这是一个解析消息的接口。 ResourceBundleMessageSourceMessageSource实现,可以从属性文件中读取。

你需要配置它(我还没有尝试编译源代码)

@Bean
MessageSource messageSource() {
     ResourceBundleMessageSource source=new  ResourceBundleMessageSource();
     source.setBasenames("messages");
     return source;
}

您必须将其连接到您要调用的代码中:

String errorText1 = source.getMessage("empty.error", "name", Locale.US);

并在您的消息文件中,您将拥有:

empty.error = {0} is empty

作为奖励,您的应用程序将为内化做好准备。

答案 1 :(得分:0)

我认为你可以做这样的事情,

 String errorText1 = env.getProperty(String.format("%s.empty.error", "name"));
 String errorText2 = env.getProperty(String.format("%s.empty.error", "department"));

编辑:

如果您仅使用此属性从属性文件中获取这些特定值,则没有任何意义。

但是如果这些值是在运行时决定的(假设所有这些属性都在属性文件中可用)。

你可以使用,

 String errorText1 = env.getProperty(String.format("%s.empty.error", dynamic-property-value-goes-here));

答案 2 :(得分:0)

我们可以使用MessageSource接口来解析消息。

ResourceBundleMessageSourceMessageSource实现,可以从属性文件中读取。

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/support/ResourceBundleMessageSource.html

然后调用getMessage()方法。

String org.springframework.context.MessageSource.getMessage(String code, Object[] args, String defaultMessage, Locale locale)

类路径中的

messages.properties 文件[src / main / resources /]

empty.error = {0} is empty

Spring-config文件

<bean id="messageSource1" class="org.springframework.context.support.ResourceBundleMessageSource">
  <property name="basenames">
    <value>messages</value>
  </property>
</bean>

Java类中的用法:

@Autowired
private MessageSource messageSource1;

public MessageSource getMessageSource1() {
  return messageSource1;
}

public void setMessageSource1(MessageSource messageSource1) {
  this.messageSource1 = messageSource1;
}

// Java类方法中的确切用法

String [] params = new String[]{"value1"};
log.info(this.messageSource1.getMessage("empty.error", params ,"", Locale.US));