我不知道为什么在处理表单时不调用我的设置器。我在网络浏览器工具中看到,使用正确的(更新的)数据触发了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
中的初始化值)方法。为什么会这样?
答案 0 :(得分:0)
我相信您的问题是命令按钮上的“ onstant =“ true”。该命令Instant =“ true”告诉JSF跳过验证和绑定阶段,这就是未调用您的setter的原因。此详细说明说明了原因:https://dzone.com/articles/jsf-and-immediate-attribute