为什么`@In(create = true)`不能在Seam中创建对象?

时间:2009-09-29 15:40:22

标签: java jboss java-ee seam

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

@In(create = true) OutletHome outletHome;

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

@In(create = true) OutletHome deactivationOutletHome;

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

  

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

造成这种问题的原因是什么?变量名如何相关?我怎么能解决它?

4 个答案:

答案 0 :(得分:5)

尝试,


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

您注入的值必须是接缝组件。当遗漏属性“值”时,假设它等于被注入的字段名称。

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


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

答案 1 :(得分:1)

这是猜测但是:

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

也许试试:

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

答案 2 :(得分:1)

Seam documentation(强调添加):

  

默认情况下,Seam会优先考虑   使用名称搜索所有上下文   属性或实例变量   正在注入。你可能希望   指定上下文变量名称   明确地,使用,例如,   @In( “当前用户”)。

我猜你有一个类似于:

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

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

答案 3 :(得分:1)

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

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