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

对野蝇有效的注射剂不适用于焊缝。其他注射对两者都有效

封景曜
2023-03-14

我很难在独立的焊接容器中进行注射。它是在库代码中运行的,也可以在wildfly容器中运行。其他注射在焊接容器中工作,只是这个给我带来了麻烦。我已经尝试通过SeContainerInitializer专门添加类和接口。我试着创建一个工厂并使用生产方法

类的注释(它是javax.inject.Singleton)。它有一个公共的无参数构造函数

package com.ticomgeo.ftc.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory; 
import javax.annotation.PostConstruct;
import javax.inject.Singleton;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

  @Singleton
  public class ExecutorImpl implements RITExecutor {
  private  static  ScheduledExecutorService TIMER = executors.newSingleThreadScheduledExecutor();
  private static final Logger LOG = LoggerFactory.getLogger(new Throwable().getStackTrace()[0].getClassName());

  public ExecutorImpl() { super(); }

  @PostConstruct
    void initImpl() {     
    LOG.info("======================================Initializedingleton");
  }

  @Override
  public  void dispose() {
    TIMER.shutdownNow();
  }

  @Override
  public boolean isDisposed() {
    return TIMER.isShutdown();
  }

  @Override
  public <J> ScheduledFuture<J> schedule(Callable<J> job, long delay, TimeUnit unit) {
    return TIMER.schedule(job, delay, unit);
  }

  @Override
  public ScheduledFuture<?> schedule(Runnable job, long delay, TimeUnit unit) {
    return TIMER.schedule(job, delay, unit);
  }

  @Override
  public <J> Future<J> submit(Callable<J> job) {
    return TIMER.submit(job);
  }

  @Override
  public  Future<?> submit(Runnable job) {
    return TIMER.submit(job);
  }

  @Override
  public  <J> Future<J> submit(Runnable job, J result) {
    return TIMER.submit(job, result);
  }
}

连接

package com.ticomgeo.ftc.util;
import javax.inject.Singleton;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

public interface RITExecutor {
    void dispose();

    boolean isDisposed();

    <J> ScheduledFuture<J> schedule(Callable<J> job, long delay, TimeUnit unit);

    ScheduledFuture<?> schedule(Runnable job, long delay, TimeUnit unit);

    <J> Future<J> submit(Callable<J> job);

    Future<?> submit(Runnable job);

    <J> Future<J> submit(Runnable job, J result);
}

注射

@Inject
RITExecutor executor;

焊接自举

  public static void main(String[] args) {
    SeContainerInitializer initializer = SeContainerInitializer.newInstance();
    /* disable discovery and register classes manually */
    try (SeContainer container = initializer.disableDiscovery()
        .addPackages(FTCServer.class)
        .addPackages(RITServer.class)
        .addPackages(Config.class)
        .addBeanClasses(ExecutorImpl.class, RITExecutor.class)
        .addPackages(AbstractConnection.class)
        .initialize()) {
    container.select(RITServer.class);
}

当我尝试在weld-se实例中访问注入的bean时,我收到了一个空指针异常。我在野蝇实例上没有遇到任何问题。部署过程中没有错误。

我有一颗豆子。虽然我假设它是由SeContainerInitializer超级割让的,但我所有jar中都有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="all">
</beans>

我使用的是weld-se-core3.0.2.Final.java版本"1.8.0_121"AbstractConnection和ExecutorImpl在同一个包和jar文件中。RITExector接口在另一个jar文件中。

我已经升级到焊接3.0.3.Final,并尝试了应用程序Scope注释,在行为上没有机会。

共有1个答案

邵毅
2023-03-14

这是我的测试场景。后构造在选择豆子时工作正常。

“”

package org.dpp.cdi.singleton;

import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.enterprise.inject.se.SeContainer;
import javax.enterprise.inject.se.SeContainerInitializer;
import javax.inject.Singleton;
import org.jboss.weld.environment.se.Weld;

/**
 *
 * @author mochieng
 */
public class TestMain {

    public static void main(String[] args) {
        SeContainerInitializer weld = Weld.newInstance();
        try (SeContainer se = weld.disableDiscovery().addBeanClasses(TestServiceImpl.class).initialize()) {
            TestService service = se.select(TestService.class).get();
        }
    }

    public static interface TestService {

        void doTest();
    }

    @Singleton
    public static class TestServiceImpl implements TestService {

        private static final Logger LOG = Logger.getLogger(TestServiceImpl.class.getName());

        @PostConstruct
        void initImpl() {
            LOG.info("Initialized singleton");
        }

        @Override
        public void doTest() {
            LOG.info("Singleton called");
        }
    }
}

“”

和专家依赖关系:

<代码>

问题可能是您的焊接版本。

 类似资料:
  • 我试图在JavaSE中建立一个非常简单的weld实现。 我有扩展类: 然后,我有一个简单的类,我想注入: 最后,我想把它注入课堂: 结果是: 我希望在构造Test()时注入简单类,并调用postconstruct方法,该方法应输出预期文本。 我到底做错了什么?

  • 问题内容: 我在与dropwizard的合作中是相当新的。目前,我正在尝试实施HK2依赖项注入。在资源内部可以很好地工作,但是在资源外部不能工作。这是我在做什么: 我创建要注入的类的实例并绑定它们。 在我的资源中,注入工作: 所有这些变量都填充有正确类的实例。 问题是:ContentModuleManager还应该通过注入来获取其中一些类: 但是这些都是空的。有人可以解释为什么这个问题会发生,我该

  • 问题内容: 我的主要课程是 控制器 JSP页面 为什么对象字段未通过AddressForm验证? 请帮忙。 问题答案: 您需要用注解装饰的成员。请参阅《JSR 303:Bean验证》的 3.1.3和3.5.1节。正如我在对问题“ 是否存在使用注释方法启用JSR 303 Bean验证的标准方法”的 回答中所解释的那样,这是根据JSR 303 真正使用注释的方式。 编辑 示例代码:Hibernate

  • 我试图创建一个使用具有生产者方法的类的简单示例,目的是生产者方法注入依赖项,而不是Weld试图创建bean。这就是为什么我已经了我还希望坚持限定符 所以我有以下几点 发动机JAVA 默认引擎。JAVA 汽车JAVA 一个pp.java 引擎制造商。JAVA 我有beans.xml 但是当我收到以下信息时,似乎没有被注入。

  • 注入是将依赖注入对象的过程。 可选注入意味着在存在时注入依赖项。 方法和场注入可以是可选的,并且如果不存在依赖性,则应该具有一些默认值。 请参阅下面的示例。 例子 (Example) 创建一个名为GuiceTester的java类。 GuiceTester.java import com.google.inject.AbstractModule; import com.google.inject.

  • 问题内容: 我让Google Guice负责连接对象。但是,如何测试绑定是否运作良好? 例如,假设我们有一个具有依赖性的类。如何测试B是否正确注入? 注意,这里没有方法,我想断言不是。 问题答案: 对于任何复杂的Guice项目,您都应该添加测试以确保可以使用这些模块来创建您的类。在您的示例中,如果B是Guice无法弄清楚如何创建的类型,则Guice将无法创建A。如果不需要A来启动服务器,但是当服务