views:

130

answers:

1

I want to create a Producer that makes it possible to inject a java.util.ResourceBundle into any class in order to get localized Strings easily. My ResourceBundle-Producer looks like this:

public class ResourceBundleProducer {
  @Inject       
  public Locale locale;

  @Inject       
  public FacesContext facesContext;

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

The Injection of Locale and FacesContext works (took the corresponding producers from the Seam 3 Alpha Source). But unfortunately, ResourceBundle is not Serializable and therefore can't be produced in this way. I'm getting the following Error from Weld when trying to access a JSF-page which calls a bean that uses my 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

Are there any ways to get my ResourceBundleResolver to work? Or are there any other mechanisms to get a similar functionality? Thanks in advance!

EDIT:

Okay, i'll spent some of my hardly earned points ;) Will also accept a good workaround for this issue!

I got another example where creating a Producer doesn't work: a FlashProducer. A FacesContext-Flash also cannot be produced because Flash isn't serializable.

+1  A: 

Well, First of all ResourceBundle is not Serializable. See here. And The message is clear

cannot produce non-serializable instances for injection into non-transient fields of passivating beans

passivating beans ??? I Think web.PersonHome is Either a Stateful Session Bean or a @ConversationScoped bean. Am i right ??? If so you should mark your bundle property as transient

private transient @Inject ResourceBundle bundle;
Arthur Ronald F D Garcia
@ifischer disclaimer: I do not use Weld yet. I use Seam. So i am not sure whether @Inject annotation can be used along with transient
Arthur Ronald F D Garcia
Congratz, you just earned yourself 50 points ;) Finally a solution! Wonder why it took that long + a Bounty, as it's kind of easy (also wonder why i didn't find out by myself...). Just tested it, also works with CDI/Weld. Now i can finally inject Resourcebundles and Contexts.
ifischer
BTW, PersonHome is a @ConversationScoped CDI/Weld-Bean (@Named)
ifischer
@ifischer You are right. Because ConversationScoped must be serializable between requests, all of its fields must implements Serializable interface **unless you mark it as transient**. It explains why you get The error message. The same issue occurs with Stateful Session beans.
Arthur Ronald F D Garcia