Я хочу создать Производителя, который позволяет ввести 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 не является сериализуемым и поэтому не может быть произведен таким образом. Я получаю следующую Ошибку от Сварки при попытке получить доступ к 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-Flash также не может быть произведен, потому что Flash не сериализуемый.
Ну, во-первых, ResourceBundle не сериализуемый . См. здесь . И сообщение ясно, что
не может создавать несериализуемых экземпляров для инъекции в непереходные поля пассивирующих bean-компонентов
пассивирующих bean-компонентов ??? Я думаю, что web.PersonHome является либо сеансовым компонентом с отслеживанием состояния, либо компонентом @ConversationScoped. Я прав ??? В таком случае следует пометить свойство пакета как временное
private transient @Inject ResourceBundle bundle;