如何加载两个ResourceBundle并单独注入它们

时间:2015-12-16 14:48:17

标签: 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>

我想根据控制器中的语言环境加载消息,我尝试了以下两种方式

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

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

修改

该应用程序是一个JAXRS应用程序,正在全局异常映射器中尝试注入。从评论我现在明白,这个类将由JAXRS容器而不是Spring(下面的代码)创建。如何让Spring知道这种注射必须有效?

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
   }

}

但注射没有发生,我正在接受NPE。我如何实现这一目标?

1 个答案:

答案 0 :(得分:2)

使用Spring并使用注释进行自动布线时,字段不能为null。在启动应用程序时需要满足依赖关系。如果没有发生,那么可能会出现两件事中的一件错误

  1. 您尚未启用注释处理
  2. 您没有使用spring托管bean,而是自己创建实例
  3. 对于第一个选项,将<context:annotation-config />添加到您的应用程序上下文中,或者如果您想要进行组件扫描,请添加<context:component-scan />,后者已经暗示了注释处理。

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