【发布时间】:2014-10-29 12:37:25
【问题描述】:
我正在构建一个 Web 应用程序(Spring 4、Primefaces 5.1 和 JPA)。
虽然我的其中一个 xhtml 页面在使用它的 ManagedBean 时没有问题,但其他页面不会真正起作用。更具体地说,UI 输入组件(如 inputText)不会从托管 Bean 调用任何设置器。 我已经在调试模式下运行了我的 Tomcat (8),这表明该页面调用了 get-methods,但根本没有 set-methods。如果我尝试持久化某些东西,所有值都是空的(或 0,如果是 int 值)。 (它甚至将一个所有值都为 null 的对象持久化到数据库中,尽管我已经声明了一些 @NotNull 约束,这些约束应该通过 JPA 应用于数据库配置)
所以,问题是:如何使我的 inputFields 与我的 ManagedBean 的字段一起工作? (Eclipse 还在编辑器中向我显示,理论上,与字段的连接是存在的,它知道托管 bean、字段和 get-/set-methods)
SoftwareManagedBean.java
@ManagedBean(name = "swmb")
@ViewScoped
public class SoftwareManagedBean extends AssetManagedBean implements
Serializable {
private String bezeichnung;
private Software neueSoftware;
// +some more private fields, every single one with its get-/set-method
@Override
public String getBezeichnung() {
return super.getBezeichnung();
}
@Override
public void setBezeichnung(final String bezeichnung) {
super.setBezeichnung(bezeichnung);
}
//instantiante the field "neueSoftware"
public void createEmptySoftware(){
if(neueSoftware != null)
return;
this.neueSoftware = new Software();
}
//Persist Software with values from inputFields
public void addSoftware() {
createEmptySoftware();
neueSoftware.setBezeichnung(getBezeichnung());
softwareService.addSoftware(neueSoftware);
//...
neueSoftware = null;
}
viewSoftware.xhtml
<h:body>
<p:dialog header="Neue Software anlegen" widgetVar="SwNeuDialog" width="60%"
closeOnEscape="true" draggable="false" resizable="false" position="center">
<h:form id="SwDlgForm">
<h:panelGrid columns="3" border="0" >
<p:outputLabel for="swBezeichnung" value="Bezeichnung: " />
<p:inputText id="swBezeichnung" value="#{swmb.bezeichnung}"
label="Bezeichnung" required="true" />
<f:verbatim/>
<p:outputLabel for="swKategorie" value="Kategorie: " />
<p:selectOneMenu id="swKategorie" value="#{swmb.kategorie}" label="Kategorie" required="true" >
<f:selectItem itemLabel="Kategorie wählen" value="#{null}" noSelectionOption="true"/>
<f:selectItems value="#{swmb.kategorieListe}" var="kat" itemLabel="#{kat.bezeichnung}" itemValue="#{kat}"/>
</p:selectOneMenu>
<p:commandButton value="neue Kategorie hinzufügen" />
<!-- + some more input fields -->
<p:commandButton value="Speichern" action="#{swmb.addSoftware()}" onclick="PF('SwNeuDialog').hide()" resetValues="true" process="@this"/>
<p:commandButton value="Abbrechen" onclick="PF('SwNeuDialog').hide()" resetValues="true" process="@this"/>
</h:panelGrid>
</h:form>
</p:dialog>
<!-- dataTable -->
</h:body>
AssetManagedBean.java
@ManagedBean
public abstract class AssetManagedBean {
//name of the hard-/software
private String bezeichnung;
//+ some more fields with get-/set methods
public String getBezeichnung() {
return bezeichnung;
}
public void setBezeichnung(String bezeichnung) {
this.bezeichnung = bezeichnung;
}
我希望代码足以解决问题,因为其余代码遵循相同的结构。我认为,问题可能出在 xhtml 文件中,但我不知道在哪里或为什么。我有 SpringBeanFacesELResolver(或者不管它叫什么),我已经查看了代码并将其与另一个 xhtml 页面及其托管 Bean 进行了比较,但不再有任何区别。 (虽然一个工作,一个不工作)
我的调试器显示了工作类/页面 (viewAdministration.xhtml) 如何调用托管 bean 的 get-/set 方法:
- 打开对话窗口:get...(), set...()
- 单击命令按钮提交/保留:get()(旧值)、set()(新值)、get()(新值)
- 另一个 get()(由 add... 方法调用)
- (+主页上dataTable的另一个get())
在 viewSoftware.xhtml 上,它看起来像这样:
- 打开对话窗口:get()
- 单击命令按钮提交/保留:
- addSoftware 方法调用的另一个 get()
如您所见,当我尝试提交时,没有设置或获取。
所以,总结一下:
- 尝试提交时未调用任何设置器
- viewSoftware.xhtml 和 SoftwareManagedBean 上的代码与另一个功能相似的 ManagedBean + xhtml 页面(我反复比较过)
- 托管 Bean 中的注解是相同的(@ManagedBean、@ViewScoped)
- inputFields 位于表单内 (
- 我完全一无所知,但我认为这是我无法看到的一些小错误。
- 我搜索过网络,尤其是 stackoverflow,但我找到的所有问题和答案都无法帮助我找出问题所在
- 即使没有从超类继承,它也无法工作(也试过了)
我希望你能帮助我。如果这篇文章缺少一些信息,我很抱歉,我尽力不让这篇文章变得太大,并且仍然尽可能多地获得相关信息。
【问题讨论】:
-
apge 上的任何 JS 错误或使用消息标签时的任何错误?
-
没有错误,更准确地说 - 甚至不会显示消息。
-
好吧,我只是弄乱了消息的语法。现在,它向我展示了 3 个元素(selectOne/selectManyMenus)错误/缺失。这可能是缺少的部分之一,也许我什至能够弄清楚这是否会阻碍集合调用。非常感谢您的提示。 :)(来不及编辑我自己的评论)
标签: jsf primefaces setter