У меня запущено приложение 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>