我正在构建一个Web应用程序(Spring 4,Primefaces 5.1和JPA)。
虽然我的一个xhtml页面在使用ManagedBean时没有任何问题,但其他页面确实无法正常工作。更具体地说, UI输入组件(如inputText)不会从托管Bean中调用任何setter。 我已经在调试模式下运行我的Tomcat(8),它向我展示了页面调用get-methods,但根本没有set-methods。如果我尝试持久化某些内容,则所有值都为null(如果是int值,则为0)。 (它甚至将一个对象保存到数据库中,所有值都为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页面及其Managed Bean进行了比较,但不再存在差异。 (虽然一个工作,一个不工作)
我的调试器显示,工作类/页面(viewAdministration.xhtml)如何调用托管bean的get- / set方法:
- 打开对话框窗口:get ...(),set ...()
- 点击commandButton提交/持久化:get()(旧值),set()(新值),get()(新值)
- 另一个get()(由add ...方法调用)
- (+主页上的dataTable的另一个get())
在viewSoftware.xhtml上,它看起来像这样:
- 打开对话框窗口:get()
- 单击commandButton以提交/持久化:
- 另一个getSoftware方法调用的get()
正如您所看到的,当我尝试提交时,没有设置或获取。
所以,总结一下:
- 没有通过提交
来调用setter- viewSoftware.xhtml和SoftwareManagedBean上的代码类似于另一个功能正常的ManagedBean + xhtml页面(我一次又一次地对它进行了比较)
Managed Beans中的- 注释是相同的(@ManagedBean,@ ViewScoped)
- inputFields位于表单内(
- 我完全无能为力,但我觉得我身边的一些小错误让我无法看到。
- 我已经通过网络进行了搜索,特别是stackoverflow,但我发现的所有问题和答案都无法帮我找到错误
- 即使没有继承超级课程,它也不会工作(也试过了)
我希望,你可以帮助我。如果这篇文章缺少一些信息,我很抱歉,我尽量不让这篇文章变得太大,并且尽可能多地获取相关的信息。
答案 0 :(得分:2)
所以,我发现了我的错误(至少,我认为我有)。我只花了2个星期,但无论如何......
我试图更具体地测试它,编写测试类和xhtml页面。没有任何效果(从简单的输入日期到自己的类)。
此问题的解决方案是在commandButton上禁用ajax( ajax =&#34; false&#34; )。当我试图了解更多内容时,我意识到打开对话框窗口的commandButton嵌套在dataTable中的一个facet中,因此在正确设置输入字段的值方面存在问题。
所以,谢谢你的帮助。也许/希望这可以或将来会帮助其他人。
答案 1 :(得分:0)
从第一眼看到代码,而不是整体阅读,尝试将process="SwDlgForm"
放在命令按钮上,而不是process="@this"
。如果这不能解决问题,我会仔细阅读并尝试提供帮助。