通过实现java.util.Map#get实现EL的动态bean属性

时间:2014-04-28 20:40:00

标签: java jsf el

我有一个@SessionScoped bean,我想将其用作地图,以便我可以在视图中使用EL动态获取其属性。

myBean['someDynamicProperty']

我通过实现java.util.Map,用我的应用程序逻辑实现get(Object o)并在所有其他覆盖Map方法中抛出UnsupportedOperationException来实现这一点。

@SessionScoped
@Named
public class MyBean implements Map<String, String> {

    @Override
    public String get(Object key) {
        // Application logic here
    }

    @Override
    public boolean containsKey(Object key) {
        throw new UnsupportedOperationException();
    }

    // All other map methods overriden like containsKey
}

这些属性是只读的,我只需要使用我的代码中的get方法,但是不安装其他Map方法是否安全?

有没有更好的方法来定义bean中EL的动态属性?

1 个答案:

答案 0 :(得分:2)

最好将地图存储为会话属性,因此您不需要创建@SessionScoped bean,并且可以通过表达式语言访问它而不会出现问题。

public void methodThatShouldCreateTheMap() {
    //declaring the variable as myBean for compatibility with your current code
    Map<String, Object> myBean = new HashMap<String, Object>();
    //fill myBean here...
    //...
    //store myBean in session
    FacesContext.getCurrentInstance()
        .getExternalContext()
        .getSession(false)
        .setAttribute("myBean", myBean);
}

您可以直接在EL中访问地图:

${myBean['key']}

来自评论:

  

问题是我的bean真的不是Map。在get方法中,我根据收到的密钥实现了我需要的逻辑。 (...)就我而言,吸气剂中的商业逻辑并不昂贵。

似乎在某种程度上你需要你的bean来实现Map接口。而是重新发明轮子或标记要抛出UnsupportedOperationException的方法,从已经实现所有方法的类(如HashMapLinkedHashMap)或实现Map的类扩展但是根本没有实现它,比如AbstractMap,并且空了其他方法:

@Named
@SessionScoped
public class MyBean extends AbstractMap<String, Object> {
    @Override
    public Object get(String key) {
        //add your logic here...
    }
    @Override
    public void set(String key, Object value) {
        //do nothing...
    }
    //similar for other unnecessary methods...
}
相关问题