jboss java CDI:@Singleton @Startup @Inject无法实现接口

yzckvree  于 2023-11-19  发布在  Java
关注(0)|答案(1)|浏览(172)

在openLiberty上,java 8,使用类

@Singleton(name = "AppContext")
@Startup
public class A implement B{
...
}

@ApplicationScoped
public class C{

    @Inject
    private A someA;

}

字符串
我得到一个

org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type A with qualifiers @Default
  at injection point [BackedAnnotatedParameter] Parameter 1 of [BackedAnnotatedMethod] @Inject public someA....


我不明白为什么如果我不实现任何接口它的工作,但只要我添加实现B它就不再是!没有找到任何有关的文档:(
谢谢!

uqxowvwt

uqxowvwt1#

它看起来像是在声明一个单例会话EJB。
默认情况下,一个没有实现接口也没有以其他方式定义任何视图的会话bean类有一个无接口视图,因此其他类可以直接使用它的类注入它:
如果bean不公开任何其他客户端视图(本地、远程、无接口、2.x远程主目录、2.x本地主目录、Web服务),并且其implements子句为空,则bean定义无接口视图。
规格4.9.8
然而,如果会话bean实现了一个接口,那么除非你使用注解来显式定义bean的业务接口,否则它实现的所有接口都被视为业务接口,它不会获得无接口视图。在这种情况下,它不能直接使用它的类注入。
[If business接口不是显式指定的,并且]如果bean类使用Local注解进行注解,或者如果bean类既没有使用Local注解也没有使用Remote注解,则所有实现的接口(不包括上面列出的接口)都被假定为bean的本地业务接口。
规格4.9.7
您应该使用EJB的接口(即@Inject private B someB;)注入EJB,或者通过将@LocalBean添加到A来显式声明EJB具有无接口视图。(在这种情况下,您可能还希望使用@Local来说明哪些其他实现的接口是业务接口)。

相关问题