当前位置: 首页 > 知识库问答 >
问题:

未创建用于注入的接口的 Java EE 字节

濮阳安澜
2023-03-14

我有一个简单的例子,我有一个REST服务< code>MyService,它应该被注入一个实现接口< code > bean interface 的类型为< code>beanB的bean beanB。我得到的错误是典型的WELD-001408,如下所示:

org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type BeanBInterface with qualifiers @BeanBQualifier
  at injection point [BackedAnnotatedField] @Inject @BeanBQualifier public com.example.MyService.beanB
  at com.example.MyService.beanB(MyService.java:0)

Rest服务:

import javax.ws.rs.Path;
import javax.inject.Inject;

@Path("/")
public class MyService {
    @Inject 
    @BeanBQualifier(BeanBQualifier.Type.PROD)
    public BeanBInterface beanB;

    public MyService() {}
}

Bean接口:

public interface BeanBInterface {
}

Bean实现:

import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.enterprise.inject.Produces;

@Startup
@Singleton
@BeanBQualifier(BeanBQualifier.Type.PROD)
public class BeanB implements BeanBInterface {
    private String name = "B";

    public BeanB() {}

    public String getName() {return name;}

    public void setName(String name) {this.name = name;}
}

Bean限定符

import javax.inject.Qualifier;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE})
public @interface BeanBQualifier {
   Type value();
   enum Type{PROD, TEST}
}

Beans.xml(在META-INF/beans.xml中试用,也在WEB-INF/beans.xml中试用)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee  http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"

    bean-discovery-mode="annotated">
</beans>

我还尝试了豆子发现模式=“所有”,但没有运气。

如果我声明beanB使用具体类BeanB而不是它在MyService中的接口,它就可以工作(但这违背了接口的目的):

如果我向< code>MyService添加一个< code>@Produces工厂方法来构造bean,它也可以工作,但是这违背了让容器为我实例化我的bean的目的:

@javax.enterprise.inject.Produces
public static BeanB get() {
    return new BeanB();
}

但是,如果此@Produces工厂方法返回接口,则它将不起作用:

@javax.enterprise.inject.Produces
public static BeanBInterface get() {
    return new BeanB();
}

共有1个答案

洪飞扬
2023-03-14

EJB对于实现时实际公开的接口有一些奇怪的规则。只会显示标记为@Local/@Remote的接口。如果您想将bean与接口和类一起使用,您需要将@LocalBean添加到ejb中。

简而言之:将@Local添加到接口,或者将@Local(BeanBInterface.class)添加到BeanB

 类似资料:
  • 我有这个问题,无法理解如何修复它,任何帮助都将得到评估。我需要用一些身份验证来保护REST方法,并且我在我的应用程序中有几个角色。我在我的类中的方法中放置了注释,实现了一些接口和Spring没有创建没有任何日志消息的bean(在我的例子中)。但是如果类没有实现接口-bean创建得很好。 在代码中,它如下所示: 控制器: 接口: 在我的情况下,控制器bean没有创建。但是如果我删除一切都会正常工作,

  • 我们的项目设置如下: 1)主模块:包含一个启动Spark流服务器的驱动程序。它有自己的Guice注入器。 2)当消息进来时,它进入另一个模块,该模块创建它自己的Guice注入器。 3) 此模块使用其他模块中的类,这些模块本身使用依赖模块。这些模块中的每一个都创建了自己的Guice注入器,因此可以独立工作、单独测试等。 这里有一个问题:现在我们需要一个单例,但是作为@Singleton创建的对象绑定

  • 我正在GKE上安装官方头盔图表。 我正在启用,因此应该应用相应的模板并创建资源。 根据官方GKE留档: 创建入口时,GKE入口控制器根据入口和相关服务中的信息创建并配置HTTP(S)负载平衡器。此外,负载平衡器有一个稳定的IP地址,您可以将其与域名关联。 然而,我的情况并非如此;入口没有与之关联的外部IP: 以下是实际的入口资源: 那是为什么呢? 在kubernetes中尝试了nginx和gce。

  • 我将使用ADFS作为身份提供者(IDP)实现对java应用程序的单点登录。通过OneLogin找到了此解决方案SSO,并使用了其示例应用程序。除此之外,还有另一个解决方案Shibboleth。 我想知道与我的上下文匹配的最佳解决方案是什么。之间,这不是Spring应用程序。 谢谢

  • 问题内容: 我最近开始使用C#,并且我想找到与此等效的方法。我不知道这叫什么,所以我将简单地通过代码向您展示。 使用Java,我能够创建如下接口: 并像下面这样在方法的参数中传递此接口: 编辑 :我的问题是关于类中的方法的,如果使用C#可以执行这样的操作。 我想知道是否有一种方法可以使用C#(在方法中实例化接口)执行类似的操作,以及这实际上是什么。谢谢! 问题答案: 哇…好吧,请允许我概括一下:

  • 我们有一个相当旧的JEE应用程序。环境: Glassfish 4.1, Java 1.7, sqljdbc4-4.1.jar 最近,我们的IT团队注意到,Glassfish日志中充满了以下消息: [2018-01-01t 22:16:36.811 0100][glassfish 4.1][警告][Pool mgr . create _ resource _ error][javax . enter