【发布时间】:2018-07-17 14:14:23
【问题描述】:
我正在开发一个使用 jsf 作为输出的小应用程序。 基本上,应用程序使用 url 参数调用,使用它来查询肥皂接口和数据库以获取更多数据,然后计算一些推荐的产品。
我根据接口的一些存根实现了计算,然后在分支中实现了查询 - 并注意到 ajax 停止工作。 我使用 ajax 根据过滤器输入更新推荐列表。
坏事:即使重置到我的稳定分支,它也不会再次工作。 现在我认为它可能是 maven,基于以下实验:
- 我在远程机器(运行 debian)上安装了一个新的服务器实例(glassfish 5.0.1 的夜间版本)。
-
我用我的 jenkins 部署了一个稳定分支的构建
-->一切正常!
-
然后我在本地机器上安装了相同 glassfish-zip 的新实例,将 .war 从远程机器复制到本地实例
-->一切正常!
-
最后,我检查了 Eclipse 中的 stable 分支,启动了 maven (m2e) 构建并在我的本地机器上部署了 .war
-->Ajax 不工作,什么也没有发生。
我只是不明白,因为 maven 应该独立运行机器,至少我认为。我已经将编码设置为 UTF-8,所以应该没有平台依赖性。
我实现了一些跟踪日志,并且可以看到,甚至没有调用支持 bean 中的方法。没有记录错误。
感谢您的每一个提示,如果有帮助,我很乐意提供更多信息。下面附加了一些初始信息。
干杯
提姆
我使用 java 8、glassfish 5.0.1、eclipse Oxygen.3a (4.7.3a) 和 m2e 和 egit。
这是过滤栏的 xhtml 的一部分:
<ui:composition
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:t="http://myfaces.apache.org/tomahawk">
<label for="drop" class="toggle">Angebote filtern ▾</label>
<h:panelGroup id="filterleiste">
<h:form id="filterleiste_hForm">
<p id="filtertitel">Filterauswahl</p>
<p id="filtererklärung">Hier kannst du Filter auswählen, um die Angebote zu finden, die dich interessieren.</p>
<!-- FILTERFRAGE EMPFEHLUNG -->
<h:panelGroup class="filterfrage" id="filterfrage_empfehlung">
<div class="filterfrage_header">Empfehlungen:</div>
<h:selectOneRadio value="#{resultpage.filter.zeigeNurEmpfehlungen}" layout="pageDirection" immediate="true">
<f:selectItem itemValue="#{true}" itemLabel="nur meine Empfehlungen anzeigen"/>
<f:selectItem itemValue="#{false}" itemLabel="alle Angebote anzeigen"/>
<f:ajax event="click"/>
</h:selectOneRadio>
</h:panelGroup>
<!-- FILTERFRAGE BEREITS BESUCHT -->
<h:panelGroup class="filterfrage" id="filterfrage_besucht">
<div class="filterfrage_header">Bereits besuchte Angebote:</div>
<h:selectOneRadio value="#{resultpage.filter.zeigeBesuchte}" layout="pageDirection" immediate="true">
<f:selectItem itemValue="#{true}" itemLabel="anzeigen"/>
<f:selectItem itemValue="#{false}" itemLabel="ausblenden"/>
<f:ajax event="click"/>
</h:selectOneRadio>
</h:panelGroup>
<h:commandButton type="button" class="button filterbutton" value="Filter anwenden">
<f:ajax render=":angebotsdarstellung" listener="#{resultpage.updateView}"/>
</h:commandButton>
<!-- FILTERFRAGE THEMA -->
<label for="filterklapper_themen" class="klapper_unterfilter">Themen filtern ▾</label>
<input type="checkbox" class="filterklapper" id="filterklapper_themen" />
<div id="filterklapper_themen" class="filterklapper">
<h:panelGroup class="filterfrage" id="filterfrage_themen">
<h:selectBooleanCheckbox value="#{resultpage.filter.zeigeAlleThemen}">
<f:ajax listener="#{resultpage.filter.zeigeAlleThemenClick}" render="filterfrage_themen"/>
</h:selectBooleanCheckbox>
<label class="filterfrage_antwortcontainer exclusive_item">
alle Themen
</label>
<!-- Angebotsthemen -->
<ui:repeat var="thema" value="#{resultpage.filter.alleThemen}" varStatus="status">
<h:selectBooleanCheckbox value="#{resultpage.filter.themenGewaehlt[status.index]}">
<f:ajax listener="#{resultpage.filter.zeigeEinzelneThemenClick}" render=":filterleiste_hForm:filterfrage_themen"/>
</h:selectBooleanCheckbox>
<h:outputLabel class="filterfrage_antwortcontainer filterfrage_eingerueckt" rendered="#{thema.isUnterbereich}">#{thema.darstellung}</h:outputLabel>
<h:outputLabel class="filterfrage_antwortcontainer" rendered="#{!thema.isUnterbereich}">#{thema.darstellung}</h:outputLabel>
</ui:repeat>
</h:panelGroup>
<h:commandButton type="button" class="button filterbutton" value="Filter anwenden">
<f:ajax render=":angebotsdarstellung" listener="#{resultpage.updateView}"/>
</h:commandButton>
</div>
[...]
</h:form>
</h:panelGroup>
</ui:composition>
标记为 [...],我已经删除了一些与“FILTERFRAGE THEMA”基本相同的部分,以编程方式从枚举构建复选框。
上面的组合包含在主页中,它只围绕过滤器栏(filterleiste.xhtml)和显示过滤器结果的部分(angebotsleiste.xhtml)构建结构。
<h:html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<h:head>
<!-- includings css files and setting metadata -->
</h:head>
<h:body>
<div class="container-wrap">
<div class="container">
<!-- some static html -->
<section>
<ui:include src="/WEB-INF/filterleiste.xhtml" </ui:include>
<ui:include src="/WEB-INF/angebotscontainer.xhtml"></ui:include>
</section>
<!-- some more html -->
</div>
</div>
</h:body>
</h:html>
这是支持 bean
@ManagedBean(name = "resultpage", eager = true)
@SessionScoped
@Data
public class ResultPage {
List<Empfehlung> gefilterteEmpfehlungen;
List<Empfehlung> alleEmpfehlungen;
private AngebotsSelector angebotsSelector;
private Umfrageergebnis umfrageergebnis;
boolean tempBool;
FilterObjekt filter;
private static final Logger LOGGER = LogManager.getLogger(ResultPage.class.getName());
public ResultPage() throws KfkException {
this.updateAll(null);
this.filter = new FilterObjekt();
this.gefilterteEmpfehlungen = this.filter.filtereEmpfehlungen(alleEmpfehlungen);
}
public void updateAll(AjaxBehaviorEvent event) throws KfkException {
LOGGER.trace("Aktualisiere Datenbasis");
this.angebotsSelector = Guice.createInjector(new KfkModul()).getInstance(AngebotsSelector.class);
this.alleEmpfehlungen = this.angebotsSelector.ermittleEmpfehlungen(0);
this.umfrageergebnis = this.angebotsSelector.getUmfrageergebnis();
}
public void updateView(AjaxBehaviorEvent event) {
//this does not appear in the log
LOGGER.debug(String.format("Updating view on filter object %S", this.filter.toString()));
this.gefilterteEmpfehlungen = this.filter.filtereEmpfehlungen(alleEmpfehlungen);
}
}
后台的FilterObjekt 类基本上只保存所有选中复选框的属性,然后根据这些属性减少给定的列表。 所以我排除了很多实际上没有被调用的方法,因为调用它们的方法本身没有被调用。
@Data
public class FilterObjekt {
private static final Logger LOGGER = LogManager.getLogger(FilterObjekt.class.getName());
private Map<Integer, Boolean> themenGewaehlt;
private boolean zeigeAlleThemen;
private final ArrayList<Angebotsthemen> alleThemen = new ArrayList<Angebotsthemen>(
Arrays.asList(Angebotsthemen.values()));
private Map<Integer, Boolean> aufwaendeGewaehlt;
private boolean zeigeAlleAufwaende;
private final ArrayList<Zeitspannen> alleAufwaende = new ArrayList<Zeitspannen>(
Arrays.asList(Zeitspannen.values()));
private Map<Integer, Boolean> formateGewaehlt;
private boolean zeigeAlleFormate;
private final ArrayList<Formate> alleFormate = new ArrayList<Formate>(Arrays.asList(Formate.values()));
private Map<Integer, Boolean> zeitraeumeGewaehlt;
private boolean zeigeAlleZeitraeume;
private final ArrayList<Zeitraeume> alleZeitraeume = new ArrayList<Zeitraeume>(Arrays.asList(Zeitraeume.values()));
private boolean zeigeNurEmpfehlungen;
private boolean zeigeBesuchte;
public List<Empfehlung> filtereEmpfehlungen(List<Empfehlung> recommendationList) {
LOGGER.traceEntry(String.format("Filtere %s Empfehlungen", recommendationList.size()));
ArrayList<Empfehlung> result = new ArrayList<>();
for (Empfehlung recom : recommendationList) {
if (this.empfehlungPasstFilter(recom))
result.add(recom);
}
return result;
}
}
【问题讨论】:
-
浏览器控制台有错误吗?在eclipse中调试它怎么样?在
FacesServlet类中设置一个断点(您需要下载 Mojarra 源代码,eclipse 会自动完成)并查看它是否被命中。您还可以在视图中设置h:messages标签,看看那里是否有任何类型的消息。 -
您好,感谢您的回复。我在浏览器控制台或 h:messages 标签中没有收到任何消息。我将尝试设置调试,现在我的 eclipse 没有与 glassfish 集成,因为上次我尝试它破坏了我的 glassfish 配置。我再写一次。