WELD не инъекционный объект - PullRequest
0 голосов
/ 07 ноября 2018

У меня запущено приложение jsf-hibernate на сервере Tomcat v7.0, и моя проблема в том, что служба никогда не внедряется в обработчик, поэтому я получаю Nullpointer в getService (). testMethod1 () в TestWELDHandler.

А может, у кого-то есть идея, почему? Я пытался добавить все, как описано здесь https://docs.jboss.org/weld/reference/latest/en-US/html/environments.html

Так что мой обработчик выглядит как

import javax.annotation.PostConstruct;
import javax.inject.Inject;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TestWELDHandler {

  private static final Logger log = LoggerFactory.getLogger(TestWELDHandler.class);

  @Inject
  private TestWELDService     service;

  public TestWELDHandler() {
    log.info("TestWELDHandler");
  }

  /**
   * The method annotated with PostConstruct MUST be invoked even if the class does not request any
   * resources to be injected.
   */
  @PostConstruct
  void init() {
    log.info("init service null " + (this.service == null));
  }

  public String testMethod1FromService() {
    log.info("testMethod1FromService service null " + (this.service == null));
    return getService().testMethod1();
  }

  public TestWELDService getService() {
    return this.service;
  }

  public void setService(TestWELDService service) {
    this.service = service;
  }

}

и у меня есть интерфейс

public interface TestWELDService {
  String testMethod1();
}

и реализация

import javax.enterprise.inject.Default;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Default
public class TestWELDServiceImpl implements TestWELDService {

  private static final Logger log = LoggerFactory.getLogger(TestWELDServiceImpl.class);

  public TestWELDServiceImpl() {
    log.info("TestWELDServiceImpl");
  }

  @Override
  public String testMethod1() {
    log.info("TestWELDServiceImpl.testMethod1");
    return "TestWELDServiceImpl.testMethod1";
  }

}

Я добавил

<resource-env-ref>
   <resource-env-ref-name>BeanManager</resource-env-ref-name>
   <resource-env-ref-type>
      javax.enterprise.inject.spi.BeanManager
   </resource-env-ref-type>
</resource-env-ref>

на мой /webapp/WEB-INF/web.xml

и

<Resource name="BeanManager" auth="Container"
        type="javax.enterprise.inject.spi.BeanManager" factory="org.jboss.weld.resources.ManagerObjectFactory" />

к элементу контекста в /webapp/META-INF/context.xml

Что я тоже должен был сделать добавить

-Dcom.sun.jersey.server.impl.cdi.lookupExtensionInBeanManager=true

К аргументам VM моего Tomcat, чтобы избавиться от

avax.naming.NameNotFoundException: Name [CDIExtension] is not bound in this Context. Unable to find [CDIExtension].

конфигурация компонента, используемая для TestWELDHandler, выглядит следующим образом:

<managed-bean>
        <managed-bean-name>testWELDHandler</managed-bean-name>
        <managed-bean-class>com.prosol.faces.handler.weldtest.TestWELDHandler</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
...