Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 为什么在post/postback之后调用@PostConstruct方法?_Spring_Jsf - Fatal编程技术网

Spring 为什么在post/postback之后调用@PostConstruct方法?

Spring 为什么在post/postback之后调用@PostConstruct方法?,spring,jsf,Spring,Jsf,我使用@postconstruct方法init(),将以下请求范围限定为Springbean: 但是,在单击save按钮后,将再次调用init()方法,在将UserDto对象保存到DB之前,取消对该对象所做的所有更改。那么我做错了什么 我刚刚测试过,init()方法在save()之前被调用,我也不明白。这不是init()方法的错误。将bean放在请求范围而不是视图范围中,这只是您自己的错误 请求作用域bean的寿命与单个HTTP请求-响应周期一样长。使用表单打开页面将计为一个HTTP请求。当相关

我使用
@postconstruct
方法
init()
,将以下
请求范围限定为
Springbean:

但是,在单击save按钮后,将再次调用
init()
方法,在将
UserDto
对象保存到DB之前,取消对该对象所做的所有更改。那么我做错了什么


我刚刚测试过,
init()
方法在
save()
之前被调用,我也不明白。

这不是
init()
方法的错误。将bean放在请求范围而不是视图范围中,这只是您自己的错误

请求作用域bean的寿命与单个HTTP请求-响应周期一样长。使用表单打开页面将计为一个HTTP请求。当相关联的HTTP响应完成将结果发送到客户端(包括所有相关联的请求范围bean)时,HTTP请求被丢弃。提交表单将被视为另一个HTTP请求,从而创建请求范围bean的全新实例。如果探索/调试实例的hashcode(和构造函数),您会注意到它实际上是两个物理上完全不同的实例。因此,
init()
绝对无法“覆盖”旧值。旧的价值观根本不存在

JSF通过引入视图范围解决了请求范围bean的这种尴尬行为。出于某种原因,在用Spring的JSFbean管理工具替换JSFbean管理工具之前,您可能听说过/读过它。SpringBean管理工具并没有视图范围的本机概念,您需要自行开发一个

如果您打算坚持使用SpringBean管理工具,那么最好的办法是保留负责正确初始化数据的请求参数以及表单提交。您可以使用
进行以下操作:

<h:commandButton value="Save" action="#{editUserBB.save()}">
    <f:param name="id" value="#{param.id}" />
</h:commandButton>

另见:


与具体问题无关在实例构造/初始化期间,应避免调用
FacesContext
。这是个糟糕的设计。在这种特殊情况下,将获取请求参数映射的那一行移动到
init()
方法内部。同样在这里,JSF bean管理工具有一个标准的
@ManagedProperty
解决方案,而Spring one没有。

我刚刚发现了你的这篇文章,它让我意识到这可能是我做错了的地方。谢谢你的回答。我使用SpringBean是因为我注入了一些Spring服务。我还认为Spring有视图范围,而JSF没有,所以这是一个糟糕的问题。。
<h:commandButton value="Save" action="#{editUserBB.save()}" />
<h:commandButton value="Save" action="#{editUserBB.save()}">
    <f:param name="id" value="#{param.id}" />
</h:commandButton>