【问题标题】:Why may `@In(create = true)` not create the object in Seam?为什么 `@In(create = true)` 不能在 Seam 中创建对象?
【发布时间】:2009-09-29 15:40:21
【问题描述】:

我有一段非常简单的代码,如下所示:

@In(create = true) OutletHome outletHome;

它工作正常(使用 Seam 2.2.0.GA),对象被创建和注入没有任何问题。但是当我尝试将其更改为:

@In(create = true) OutletHome deactivationOutletHome;

突然停止工作,导致异常:

org.jboss.seam.RequiredException:@In 属性需要非空值:customerHome.deactivationOutletHome

出现这种问题的原因可能是什么?变量名如何相关?我该如何解决?

【问题讨论】:

  • 我不相信变量名的改变是唯一的改变......是吗?改回outletHome还能用吗?
  • 是的,变量名是唯一的变化。正如答案所指出的那样,这正是问题所在。

标签: java jboss jakarta-ee seam


【解决方案1】:

试试,


@In(create = true, value="outletHome")
OutletHome deactivationOutletHome;

您注入的值必须是一个接缝组件。当缺少属性“值”时,假定等于注入的字段名称。

访问接缝组件的其他方法是:


@In(value="componentName", create = true)
@In("#{componentName}")

【讨论】:

  • 谢谢。这是对我的问题的精确描述。匹配是由变量名完成的,而我以前认为它是由类名完成的。
【解决方案2】:

这是一个猜测,但是:

如果您必须确保变量名称与您在 components.xml 文件中声明的名称相同。

不妨试试:

@In(create = true, value="#{outletHome}")
OutletHome deactivationOutletHome;

【讨论】:

  • 谢谢。这是正确的并解决了我的问题,但@cetnar 的答案更清晰、更准确。
【解决方案3】:

来自Seam documentation(强调添加):

默认情况下,Seam 会优先处理 使用名称搜索所有上下文 属性或实例变量 正在注入。你不妨 指定上下文变量名称 明确地,使用,例如, @In("当前用户")。

我猜你的 OutletHomeImpl 看起来像:

@Name("outletHome")
class OutlookHomeImpl implements OutletHome { ... }

为了让 Seam 进行注入,变量需要与您要注入的 bean 具有相同的名称。有其他方法可以做到这一点,但这是“约定优于配置”的方式。

【讨论】:

  • 谢谢。这是部分正确的,因为我没有 Impl 类,但变量名上的注释确定了我的问题的原因。
【解决方案4】:

请记住,SEAM 通过异常“范式”使用配置。在这种情况下,例外是变量名称不等于组件的名称,因此您必须明确告诉 seam 您正在搜索哪个组件。

这很好,因为它可以导致编写更少的代码,如果你遵循标准,但如果你不记得幕后发生的事情,它可能会导致像这样的一些疑问:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 2011-07-22
    • 2015-06-21
    • 1970-01-01
    • 2021-10-22
    • 2022-06-12
    相关资源
    最近更新 更多