どのように吹き非直列化可能クラス(java.util.ResourceBundle)溶接
-
25-09-2019 - |
質問
をしたいと思っていプロデューサーへの注入は、java.util.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が直列化可能でないとできない制作しました。もしかしたら以下のエラーから溶接しようとした場合にアクセス情ページを呼びかけは、beanを使用する私の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す。又はその他の機構に類似の機能性?感謝。
編集:
大丈夫、あのほとんど得したポイント) も受け入れの良い対処すのです!
私は別の例の場をプロデューサーな作品:a FlashProducer.A FacesContext-フラッシュもできない生産量Flashな直列化可能です。
解決
ものすべてのResourceBundle は直列化可能でない.見 こちらの.のメッセージが明確な
を出せない 非直列化可能 インスタンスへの注射 非transient 分野を不動態特性を有する不動態豆
を不動態特性を有する不動態豆 ???と思い ます。PersonHome いかのどちらかにステートフルセッション豆や@ConversationScoped。ょうか???その場合すべき お客様のバンドルの財産としての過渡
private transient @Inject ResourceBundle bundle;
他のヒント
としてのコメントのスレッドの受け答えのアーサー.しましたが、 このブログ など この を不動態化/活性化の実験です。の実験とMrDのコメントの一過性のある手開きのドアを入るとNULLを受与することが知られている。このように対応するため、非直列化可能でない会員の特性に不動態化処理できる豆類sessionscoped,conversationscoped、ステートセッション豆)から以下のソリューション:
private ResourceBundle bundle;
@PostConstruct
@PostActivate
public void getResourceBundle() {
bundle = ResourceBundle.getBundle("/messages", locale );
}
このソリューションはさらに非直列化可能性員は、再度初期化時に出入りするの。
最終課題
最終課題では、噴射のSLF4jロガーた非直列化可能でない前slf4j1.5.3、 し見積もり:
としてのSLF4J版1.5.3,loggerインスタンス生直列化します。このように、直列化は、ホストクラスなが特 行動でも、ロガーはとして宣言されたインスタンス変数.
このようにしてお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;