我想创建一个生产国,使它能够注入java。工具.ResourceBundle入任何一类,以便得到本地化串容易。我ResourceBundle-生产者看起来像这样:

public class ResourceBundleProducer {
  @Inject       
  public Locale locale;

  @Inject       
  public FacesContext facesContext;

  @Produces
  public ResourceBundle getResourceBundle() {
    return ResourceBundle.getBundle("/messages", locale )
  }
}

注入的区域和FacesContext工作(采取了相应的生产者从该缝3个阿尔法的来源)。但不幸的是,ResourceBundle不序列化和因此不可能产生以这种方式。我得到的以下错误,从焊接在试图访问一个JSF的网页,其中呼吁豆使用我的ResourceBundle:

Caused by: org.jboss.weld.IllegalProductException: WELD-000054 Producers cannot produce non-serializable instances for injection into non-transient fields of passivating beans\\n\\nProducer\: org.jboss.weld.bean-/D:/Program Files (x86)/GlassFish-Tools-Bundle-For-Eclipse-1.2/glassfishv3/glassfish/domains/teachernews/applications/teachernews/-ProducerMethod-services.producers.ResourceBundleProducer.getResourceBundle()\\nInjection Point\: field web.PersonHome.bundle

是否有任何方法来获得我的ResourceBundleResolver工作?或是有任何其他机制得到一个类似的功能?在此先感谢!

编辑:

好吧,我会花一些我几乎不能获得点;) 还将接受一个很好的解决方法对这个问题!

我有另外一个例子,在那里创造一个生产者不能工作:一FlashProducer.一FacesContext-闪也不能生产,因为闪光不序列化。

有帮助吗?

解决方案

嗯,首先ResourceBundle 不序列化.看看 在这里,.和消息是明确的

不能产生 无序列化 实例,用于注入 非瞬间 等领域的钝化豆

钝化豆 ???我认为 网。PersonHome 是个状态届会议豆或@ConversationScoped豆。我???如果是的话,你应该 马克你捆绑的财产作为瞬时的

private transient @Inject ResourceBundle bundle;

其他提示

为每意见线所接受的答案,亚瑟。我跟着 这个博客的 以及 这一个 进行钝化/激活实验。实验证明文评论瞬时的财产将空吁激活。因此,对付无序列化件性质的一个钝化能够豆(即,sessionscoped,conversationscoped和状态届会议豆类),我建议将以下方案:

private ResourceBundle bundle;

@PostConstruct
@PostActivate
public void getResourceBundle() {
    bundle = ResourceBundle.getBundle("/messages", locale );
}

这个解决方案,使确保非序列化财产成员重新初始化每次进入的准备状态。

一个最终解决问题

一个最后问题的解决是注射SLF4j记录器,这是非序列化之前slf4j1.5.3, 我引用:

为SLF4J版1.5.3,记录仪的实例生存序列化。因此,化为主流不再需要任何特殊 行动,即使在记录中声明作为实例的变量。

因此只要你slf4j依赖是1.5.3或以后你可以安全地注射SLF4j记录如下:

@Produces
@LogbackLogger
public Logger produceLogger(InjectionPoint injectionPoint){
    return LoggerFactory.getLogger(injectionPoint.getMember().getDeclaringClass().getName());
}

假设你宣布的限定:

@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface LogbackLogger {
}

然后在一个钝化能力豆,注如下:

@Inject
@LogbackLogger
private Logger logger;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top