Hi,

I am facing a problem when trying to use Java 5 enums as parameters to getters in a velocity template. Obviously, Velocity does not seem to manage it correcty. I'd like to be able to write something like :

$person.get(Title) where Java code would be person.get(PersonEnum.Title)

To acheive that, the only way I've found is to expose an enum wrapper which allows me to retrieve enum values. The problem is that I would have to do that for each enum in my application which is not optimal. Here's a sample code which explains my solution. I'm not sure there's any better way, since I can't find any documentation about that :

public class VelocityEnumProblem {

   public static void main(String[] args) {
       try {
           Velocity.init();
           VelocityContext ctx = new VelocityContext();
EnumMap<MyEnum,String> container = new EnumMap<MyEnum, String>(MyEnum.class);
           container.put(MyEnum.ONE, "something to store");
           ctx.put("container", container);
           ctx.put("MyEnum", new MyEnumWrapper());
           PrintWriter pout = new PrintWriter(System.out);
Velocity.evaluate(ctx, pout, "test", "$container.get($MyEnum.ONE) ");
           pout.close();
       } catch (Exception e) {
           e.printStackTrace();
       }
   }

   public static class MyEnumWrapper {
       public MyEnum get(String name) {
           return MyEnum.valueOf(name);
       }
   }

   public enum MyEnum {
       ONE,
       TWO,
       THREE
   }

}

Reply via email to