gpt4 book ai didi

java - 对话范围意外行为

转载 作者:行者123 更新时间:2023-11-30 11:51:51 24 4
gpt4 key购买 nike

我有一个 JSF 页面,用户可以在其中将他们的汽车输入我的数据库。该表单具有三个输入字段:

  • 制造商
  • 模型
  • 注册

ManufacturerModel 字段都是自动完成字段。为了完成 Model 字段,我需要知道用户在提交表单之前在 Manufacturer 字段中选择的值。为此,我设置了一个 AJAX 调用以将所选值通知托管 bean:

<p:autoComplete id="manufacturer"
minQueryLength="3"
completeMethod="#{carController.complete}"
forceSelection="true">
<p:ajax event="itemSelect"
listener="#{carController.manufacturerSelected}" />
</p:autoComplete>

在托管 bean 中:

public void manufacturerSelected(SelectEvent se) {
manufacturer = se.getObject().toString();
}

模型的自动完成字段和处理程序方法看起来大致相同,但值略有不同。

为了在多个 XHR 请求中保留 manufacturer 值,我已将 bean 设置为 ConversationScoped 并在 @PostConstruct 中开始对话注释方法:

@Named
@ConversationScoped
public class CarController implements Serializable {

@Inject
private Conversation conversation;

@PostConstruct
private void init() {
conversation.begin();
}

我希望 bean 只为页面实例化一次,因为对话尚未结束,并保留 manufacturer 字段中的值。然而,这并不成立,每个 XHR 请求都会再次实例化 bean,导致 manufacturer 字段也为 null。在 PostConstruct 方法中设置断点表明它实际上正在被调用,manufacturerSelected 方法也是如此。

我怀疑这与我没有手动传播对话 ID 这一事实有关,但文档说该 ID 应该随任何面孔请求自动传播。这实际上是真的吗,这是否意味着 XHR 请求不一定是面孔请求?

编辑: 在 bean 的不同位置设置断点表明每个 XHR 请求都有一个新的 bean(conversation.getId() 不断变化)所以我显然不传播 ID 权利。如何使用 p:ajax 传播 ID,我在哪里可以使用 EL 获取它?

最佳答案

既然你并没有真正使用对话(至少在你给出的例子中没有),为什么不使用 View 范围?这将完全按照您的意愿行事,而无需传播对话 ID 的开销。

请注意,要使 @ViewScoped 起作用,您必须将 bean 更改为 JSF 托管 bean(删除 @Named)。这是由于 Java EE 6 中的设计错误/规范疏忽所致。如果您想继续使用 CDI,那么可以使用 Seam 3 中的 Java EE 6 扩展来修复此错误。

关于java - 对话范围意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7213324/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com