无法调用JSF设置器

时间:2018-12-01 14:59:14

标签: jsf primefaces

我不知道为什么在处理表单时不调用我的设置器。我在网络浏览器工具中看到,使用正确的(更新的)数据触发了POST请求。但这不会影响我的绑定bean。

<p:commandButton value="Action"
                     immediate="true"
                     action="#{beanView.actionForString('5/13/015')}"
                     oncomplete="PF('some_widget').show()"
                     update="some_widget_update"/>
    <p:dialog id="some_widget_update" widgetVar="some_widget" width="800">
        <ui:include src="/view.xhtml" />
    </p:dialog>

模板形式:

<h:form id="contentForm"
                prependId="false"
                enctype="multipart/form-data">
            <p:messages autoUpdate="true"
                        globalOnly="true"
                        showDetail="true"
                        for="formMessages"
                        closable="true" />
            <div id="starterDiv"
                 class="ui-fluid">
                <ui:insert name="formAsd" />
            </div>
        </h:form>

和view.xhtml:

    <ui:define name="formAsd">
        <h:panelGroup rendered="#{beanView.payment!= null}">
            <c:set var="payment" value="#{beanView.payment}" />
  <div class="ui-g with_background">
               <div class="ui-g-2">Payment Id:</div>
               <div class="ui-g-2">
                   <p:inputText value="#{payment.id}"/>
               </div>
          </div>
  <p:commandButton value="Save"
                                 immediate="true"
                                 process="contentForm"
                                 action="#{beanView.save()}" style="width: 150px"/>
   </h:panelGroup>
</ui:define>

bean视图如下所示:

@ManagedBean
@ViewScoped
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
public class BeanView implements Serializable {

    Payment payment;

    @Setter(onMethod=@__({@Autowired}))
    transient PaymentService paymentService;

    public void save() {
        paymentService.registerPayment(payment); // here It's unchanged!!
   }
    public void actionForString(String asd) {
        payment= paymentService.takeForString(asd)

    }
}

Getter工作正常,我可以在view.xhtml中看到服务返回的值。然后,如上所述,在更改输入值并单击“保存”按钮之后,调试器显示了旧值(来自actionFroString中的初始化值)方法。为什么会这样?

1 个答案:

答案 0 :(得分:0)

我相信您的问题是命令按钮上的“ onstant =“ true”。该命令Instant =“ true”告诉JSF跳过验证和绑定阶段,这就是未调用您的setter的原因。此详细说明说明了原因:https://dzone.com/articles/jsf-and-immediate-attribute