【问题标题】:CDI - Injection not resolvedCDI - 注入未解决
【发布时间】:2017-08-01 09:31:40
【问题描述】:

我有这门课:

@ApplicationScoped
public class ConfigurationResources {...}

另一方面,我在ClientAuthzService 中使用ConfigurationResources

public class ClientAuthzService {
    @Inject protected ConfigurationResources configurationResources;
    //...
}

当请求端点到达我的 JAXRS 接口时,我将其注入:

public class ClientAuthzEndpoint implements IClientAuthzEndpoint {
    @Inject private ClientAuthzService clientAuthzService;
    //...
}

IClientAuthzEndpoint:

@Path(value = "/client")
@Produces(MediaType.APPLICATION_JSON)
public interface IClientAuthzEndpoint {

但是,ConfigurationResources 不会注入到 ClientAuthService 中:

public ClientAuthzService()
    {
        this.mongoUserRepository = new UserMongoRepository(
            new MongoContextSource(
                this.configurationResources.getMongodbServer(),
                this.configurationResources.getMongodbPort(),
                this.configurationResources.getMongodbDatabase(),
                this.configurationResources.getMongodbUsername(),
                this.configurationResources.getMongodbPassword(),
                this.configurationResources.getMongodbAuthenticationDatabase()
            )
        );

由于configurationResourcesnull,我得到了NullReferenceException

有什么想法吗?

【问题讨论】:

    标签: jakarta-ee cdi


    【解决方案1】:

    您不能从构造函数访问注入的对象。 CDI 需要能够在向对象注入内容之前构造对象。

    您可以在 @PostConstruct 注释方法中执行您需要的任何初始化:

    public class ClientAuthzService {
    
        @Inject
        private ConfigurationResources configurationResources;
    
        private UserMongoRepository mongoUserRepository;
    
        public ClientAuthzService() {
        }
    
        @PostConstruct
        void initialise() {
            this.mongoUserRepository = new UserMongoRepository(
                new MongoContextSource(
                    this.configurationResources.getMongodbServer(),
                    this.configurationResources.getMongodbPort(),
                    this.configurationResources.getMongodbDatabase(),
                    this.configurationResources.getMongodbUsername(),
                    this.configurationResources.getMongodbPassword(),
                    this.configurationResources.getMongodbAuthenticationDatabase()
                )
            );
        }
    
        ...
    }
    

    【讨论】:

      【解决方案2】:

      确保您的ClientAuthzEndpoint 是一个有效的 bean(在 CDI 上下文中)。 尝试在您的班级上方添加:

      @Named
      @RequestScoped
      

      换句话说。确保您使用 @Inject 的所有类都是有效的 bean,因此具有正确的注释。

      【讨论】:

        猜你喜欢
        • 2016-01-11
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        • 2017-10-25
        • 2014-06-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多