Question

I am trying to use an ENUM for a form:select as such:

<form:select path="myEnum">
  <form:options itemLabel="resourceBundleLabel" />
</form:select>

With an Enum that looks something like:

public enum MyEnum {
  ONE("rb.one"), TWO("rb.two");

  private MessageSource messageSource;

  private String rbKey;

  public String getResourceBundleLabel() {
    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    Locale locale = request.getLocale();
    return messageSource.getMessage(this.rbKey, null, locale);
  }

  public MyEnum(String rbKey) {
    this.rbKey = rbKey;
  }
}

The problem is that I can't seem to figure out how to get the MessageSource injected. I tried adding @Component and @Autowired (got an error because there was no default constructor. I then tried switching @Component to @Configurable. Then I tried removing both annotation, and implementing MessageSourceAware. In all cases, the messageSource is null when I get inside the getResourceBundleLable().

Ultimately, what I am trying to accomplish is to build out the select options using an Enum, but make it such that is uses the proper Resource Bundle and local. Am I just wasting my time on something that is not feasible?

Was it helpful?

Solution

See my answer here for how to inject dependencies into enums with minimal plumbing.

OTHER TIPS

You can also see my answer in here. It doesn't not inject it but use it as a static method.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top