代码之家  ›  专栏  ›  技术社区  ›  Hosam Aly

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

  •  1
  • Hosam Aly  · 技术社区  · 15 年前

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

    @In(create = true) OutletHome outletHome;
    

    它工作得很好(使用Seal2.2.2.GA),并且创建和注入对象没有任何问题。但当我试着把它改成:

    @In(create = true) OutletHome deactivationOutletHome;
    

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

    org.jboss.seam.requiredException:@in属性要求非空值:customerHome.deactivationOutletHome

    造成这种问题的原因可能是什么?变量名有什么关系?我该怎么解决呢?

    4 回复  |  直到 11 年前
        1
  •  5
  •   cetnar    15 年前

    尝试,

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

    注入的值必须是seam组件。当属性“value”丢失时,假设它等于注入的字段名。

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

    
    @In(value="componentName", create = true)
    @In("#{componentName}")
    
        2
  •  1
  •   Peter D    15 年前

    这是一个猜测,但是:

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

    也许尝试一下:

    @In(create = true, value="#{outletHome}")
    OutletHome deactivationOutletHome;
    
        3
  •  1
  •   David Krisch    15 年前

    Seam documentation (重点补充):

    默认情况下,seam将优先 使用名称搜索所有上下文 财产或 实例变量 正在注射。你可能希望 指定上下文变量名 显式地,例如, @in(“当前用户”)。

    我猜你的OutletHomeImpl是这样的:

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

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

        4
  •  1
  •   Tiago    15 年前

    记住seam使用的是一个例外的配置“范型”。在这种情况下,异常情况是变量名不等于组件名,因此您被迫显式地告诉seam您要搜索的组件。

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