使用Infispan缓存填充JSF SelectOneMenu

时间:2018-09-11 11:00:24

标签: jsf primefaces infinispan

我试图将下拉数据缓存在infinispan中。

我的Infinispan进口商品是(是,还有其他进口商品):

import org.infinispan.Cache;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.manager.DefaultCacheManager;

这是我的豆子:

@Startup
@Named("cache")
@ApplicationScoped
public class CacheManagerBean implements Serializable {

private static final long serialVersionUID = 1L;

private DefaultCacheManager cacheManager;

// Dropdown-Values
private Cache<Integer, String> nations;

@Inject
MyEJB myEJB;

@PostConstruct
public void init(){
    createCache();
    updateCache();
}

private void createCache() {
    // Construct a simple local cache manager with default configuration
    cacheManager = new DefaultCacheManager();
    // Define cache configuration
    cacheManager.defineConfiguration("nations", new ConfigurationBuilder().build());
}

public void updateCache() {
    nations = cacheManager.getCache("nations");
    nations.putAll(myEJB.fetchNations());
}

public Cache<Integer, String> getNations() {
    return nations;
}

public void setNations(Cache<Integer, String> nations) {
    this.nations = nations;
}

国家/地区缓存中充满了我需要的数据。

现在我的问题是,我想用此缓存的数据创建一个SelectOneMenu并用它填充selectItems:

        <p:selectOneMenu id="nation"
            value="#{bean.nation}"
            styleClass="DetailsDropdown" var="activeNation">
            <f:selectItem itemLabel="" itemValue="" noSelectionOption="true" />
            <f:selectItems value="#{cache.nations.entrySet()}" var="entry"
                itemValue="#{entry.key}" itemLabel="#{entry.value}" />
        </p:selectOneMenu>

下拉菜单始终为空。有没有解决方法,或者我错过了什么? 也许我需要为Maven或Wildfly添加一些配置?

我使用Wildfly 12,Primefaces 6.2,Infinispan 9.2.1.Final和Maven。

谢谢!

编辑:SelectOneMenu在面板内部。如果我在视图bean中创建一个Map,而不是使用缓存,则它可以工作。所有bean属性都有getter和setter!缓存具有数据,问题仅在于使用JSF进行访问!

您可以看到缓存中的数据: http://prntscr.com/ktuead

应该如何(就像使用完全相同的代码和HashMap一样): http://prntscr.com/ktufji

这是带有缓存的下拉列表(没有错误!): http://prntscr.com/ktufqw

1 个答案:

答案 0 :(得分:0)

问题出在var属性上。如果存在但未使用此属性,看来p:selectOneMenu无法正常工作。这是我以前做过的测试的残余。

    <p:selectOneMenu id="nation"
        value="#{bean.nation}"
        styleClass="DetailsDropdown">
        <f:selectItem itemLabel="" itemValue="" noSelectionOption="true" />
        <f:selectItems value="#{cache.nations.entrySet()}" var="entry"
            itemValue="#{entry.key}" itemLabel="#{entry.value}" />
    </p:selectOneMenu>

删除var标签后,一切正常!

感谢库克尔捷耶的时间和耐力!