java - 如何加载两个ResourceBundle并分别注入(inject)

标签 java spring spring-mvc dependency-injection

我正在使用 Spring 将本地化资源包加载到我的应用程序中。这是我所做的。

<bean id="systemMessages" class="o.s.c.s.ResourceBundleMessageSource">
   <property name="basename" value="locale/system"> 
</bean>

<bean id="clientMessages" class="o.s.c.s.ResourceBundleMessageSource">
   <property name="basename" value="locale/client"> 
</bean>

我想根据 Controller 中的区域设置加载消息,我尝试了下面的两种方法

@Autowired
@Qualifier("clientMessages")
ResourceBundleMessageSource clientMessages;

@Resource(name="systemMessages")
ResourceBundleMessageSource systemMessages;

编辑

该应用程序是一个 JAXRS 应用程序,并且正在全局异常映射器中尝试注入(inject)。从评论中我现在了解到这个类是由 JAXRS 容器而不是 Spring 创建的(下面的代码)。如何让Spring知道这次注入(inject)一定起作用?

import javax.ws.rs.WebApplicationException;

//other imports

public class GlobalWebApplicationException extends WebApplicationException{
   private String systemMessage;
   private String clientMessage;

   //Autowire the multiple resourcebundles

   public GlobalWebApplicationException (String key, Locale locale) {
       // this is where I want to use the injected object fetch the property
   }

   public doSomething(){
       // Business Logic
   }

}

但是注入(inject)没有发生,我得到了 NPE。我如何实现这一目标?

最佳答案

当使用 Spring 并让它使用注释进行 Autowiring 时,字段不能是 null 。应用程序启动时需要满足依赖关系。如果没有发生这种情况,则可能存在以下两处错误之一

  1. 您尚未启用注释处理
  2. 您没有使用 Spring 托管 Bean,而是自己创建实例

对于第一个选项,添加 <context:annotation-config />添加到您的应用程序上下文,或者如果您想要进行组件扫描,请添加 <context:component-scan />后者已经暗示了注释处理。

对于第二个选项,您需要使您的 bean 成为 Spring 托管 bean 并使用它,而不是自己创建新实例。

关于java - 如何加载两个ResourceBundle并分别注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34315045/

相关文章:

java - 我们应该在 Spring Boot 中为存储库层编写单元测试和集成测试吗?

java - Ant 过滤 - 如果未设置属性则失败

java - 无法使用maven插件在tomcat中启动Spring应用程序

java - Spring Autowired 服务和 Controller 不工作

java - 如何在非必填字段上使用@Pattern JSR 303

spring jndi数据源设置

java - 回调 Lambda 表达式 + JavaFX

java - 如何使 ActionBar 在 "Accessibility Services"处可移动

java - 连接超时 spring boot 应用程序和 mysql

java - 无法 Autowiring 字段 spring-boot