如何注入一个不可序列化类(如java。工具.ResourceBundle)与焊接
-
25-09-2019 - |
题
我想创建一个生产国,使它能够注入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;