我是一个处理常见问题和应用方面的核心项目,名为" Common"。服务项目将此核心项目用于常见流程。
我必须在" Common"中管理异常处理。我还必须从属性文件中共同阅读消息。但是服务也可以有自定义消息。
所以我把MessageUtils放在Common
中MessageUtils.java
@Component
public class MessageUtils {
@Autowired
private MessageSource messageSource;
private static MessageSourceAccessor accessor;
@PostConstruct
private void init() {
accessor = new MessageSourceAccessor(messageSource, Locale.ENGLISH);
}
public static String getMessage(String messageKey) {
return accessor.getMessage(messageKey);
}
}
在Common中,我有common-messages.properties
|-src/main/resources
|--common-messages_en.properties
允许将服务命名为Service_1,它取决于Common。
Service_1也有service-messages_en.properties
|-src/main/resources
|--service-messages_en.properties
为了注入常见的特定配置,我已经公开了一个Config类,并将其导入服务的Spring Boot初始化程序类中。我还定义了" common-messages_en.properties"作为CommonConfig中的属性源。
CommonConfig.java
@ComponentScan({ "com.example.common.core"})
@EntityScan({ "com.example.common.entity" })
@EnableJpaRepositories(basePackages = { "com.example.common.dao" })
@PropertySource(value = { "classpath:common-messages_en.properties"})
public class CommonConfig {
}
因此,在Service_1中我启动了SpringBoot应用程序的BootApp类。 CommonConfig也在那里导入。
@SpringBootApplication
@Import(CommonConfig.class)
public class BootApp extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(BootApp.class, args);
}
}
当我打电话
MessageUtils.getMessage("someMessageKey.thatDefinedIn.Service");
没关系,我可以阅读服务的消息。
但是当我想在服务中阅读一条公共消息时;
MessageUtils.getMessage("someMessageKey.thatDefinedIn.Common");
它获得NoSuchMessageException。
如何正确合并不同jar中的不同属性文件?
答案 0 :(得分:0)
确定。当我在启动时初始化ReloadableResourceBundleMessageResource时;
@Bean
public ReloadableResourceBundleMessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new
ReloadableResourceBundleMessageSource();
messageSource.setBasenames("classpath:service-messages","classpath:common-messages");
messageSource.setCacheSeconds(3600); //refresh cache once per hour
return messageSource;
}
(假设默认语言环境是" en")我可以在运行时访问公共和服务消息。