【问题标题】:Using Infispan Cache to fill JSF SelectOneMenu使用 Infinispan Cache 填充 JSF SelectOneMenu
【发布时间】:2019-02-15 20:49:11
【问题描述】:

我试图在 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 中制作地图,而不是使用缓存,它会起作用。所有 bean 属性都有 getter 和 setter!缓存有数据,问题只是用 JSF 访问它!

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

应该怎么做(代码和HashMap一模一样): http://prntscr.com/ktufji

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

【问题讨论】:

  • 嗨,通过标记它 oracle 和 wildfly,您可以隐含地声明它,例如确实适用于 mysql 或 glassfish。标签不是用于您使用什么,而是用于指示问题所在的位置。而且你的头衔也不好。它只是声明了两个标签。
  • 谢谢,我删除了标签并更改了标题
  • 如果您只使用&lt;f:selectItems value="#{cache.nations}" /&gt; 或使用纯jsf &lt;h:selectOneMenu ...&gt; 而不是primefaces 怎么办?顺便说一句,你的 PF 版本是什么?
  • @Kukeltje 非常感谢,您对纯 JSF 的问题帮助了我。现在我知道我的错误了!
  • 在你关于不工作版本的截图中,我什至看不到“无选择选项”。当然下拉部分不仅被屏蔽,而且面板边界(可能不在原始边界中)

标签: jsf primefaces infinispan


【解决方案1】:

问题出在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 标签后一切正常!

感谢 Kukeltje 付出的时间和耐心!

【讨论】:

  • 请将您的 PF 版本发布到问题中。可能是相关的。因此,这 WOULD NOT 也有效地与静态地图一起工作......实际上根本与 infinispan 无关。因此,即使之前“它与静态地图一起工作”,**总是,总是,总是,创建一个minimal reproducible example。您已经注意到您正在运行的最新 xhtml 代码也不适用于静态地图。将问题“简化”到此代码基本问题也许很好。将来遇到问题时请记住此 Q/A...
  • 是的,下次我会在发布之前测试示例。这会节省你很多时间。是我的第一篇文章,再次抱歉!会记住的!
  • 干杯,那我很高兴!
猜你喜欢
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多