Primefaces不会在ManagedBean上调用setter

时间:2014-10-29 12:37:25

标签: jsf primefaces setter

我正在构建一个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&auml;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&uuml;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,但我发现的所有问题和答案都无法帮我找到错误
  •   
  • 即使没有继承超级课程,它也不会工作(也试过了)
  •   

我希望,你可以帮助我。如果这篇文章缺少一些信息,我很抱歉,我尽量不让这篇文章变得太大,并且尽可能多地获取相关的信息。

2 个答案:

答案 0 :(得分:2)

所以,我发现了我的错误(至少,我认为我有)。我只花了2个星期,但无论如何......

我试图更具体地测试它,编写测试类和xhtml页面。没有任何效果(从简单的输入日期到自己的类)。

此问题的解决方案是在commandButton上禁用ajax( ajax =&#34; false&#34; )。当我试图了解更多内容时,我意识到打开对话框窗口的commandButton嵌套在dataTable中的一个facet中,因此在正确设置输入字段的值方面存在问题。

所以,谢谢你的帮助。也许/希望这可以或将来会帮助其他人。

答案 1 :(得分:0)

从第一眼看到代码,而不是整体阅读,尝试将process="SwDlgForm"放在命令按钮上,而不是process="@this"。如果这不能解决问题,我会仔细阅读并尝试提供帮助。