java - 对话范围意外行为

标签 java jsf jakarta-ee primefaces

我有一个 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/

相关文章:

java - 执行Java -cp

css - 在 JSF Web 应用程序中使用 SASS

jsf - 如何在 JSF 组件属性中使用 EL 条件运算符?

jsf - 应用请求值和更新模型值之间的差异

jakarta-ee - apachetiles 3 - 如何访问 session 范围

java - 为什么 Joda-Time-2.3 返回不正确的差异?

Java编译时无法访问代码错误

java - 我应该从哪里开始调查 SocketTimeoutException : Read timed out

java - 使用 selenium 驱动程序在鼠标悬停时测试工具提示

java - 对于 eclipse,哪个 -vm 更可取?