我正在尝试使用 CDI 将 EntityManager 注入到我的应用程序中,但在尝试使用它时 EntityManager 为空。
这是我的代码,我遵循了几个有关如何注入 EntityManager 的教程,并且我使用与这些教程中相同的代码。
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface DevDatabase {
}
@Singleton
public class JPAResourceProducer {
@Produces
@PersistenceContext(unitName = "DevPU")
@DevDatabase
private EntityManager em;
}
Run Code Online (Sandbox Code Playgroud)
持久化.xml
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="DevPU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>entity.MyEntity</class>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/MyDB"/>
<property name="javax.persistence.jdbc.user" value="appuser"/>
<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
<property name="javax.persistence.jdbc.password" value="apppassword"/>
</properties>
</persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)
这就是我在 DAO 中使用它的方式
public abstract class GenericDAO<T> {
@DevDatabase
@Inject
private EntityManager em;
private final Class<T> entityClass;
public GenericDAO(Class<T> …Run Code Online (Sandbox Code Playgroud) 有谁知道在带有嵌入式 Tomcat 的 Spring Boot Jar 应用程序中引导 Weld 的方法。
我尝试将 org.jboss.weld.environment.servlet.Listener 与
import org.jboss.weld.environment.servlet.Listener;
@SpringBootApplication
public class MyApplication
{
public static void main(String[] args)
{
SpringApplication.run(MyApplication.class, args);
}
@Bean
public Listener weldListener()
{
return new Listener();
}
}
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
java.lang.RuntimeException: WELD-ENV-001104: Cannot get StandardContext from ServletContext.
at org.jboss.weld.environment.tomcat.WeldForwardingInstanceManager.getStandardContext(WeldForwardingInstanceManager.java:104) ~[weld-servlet-2.4.6.Final.jar:2.4.6.Final]
...
Caused by: java.lang.ClassCastException: org.apache.catalina.core.StandardContext$NoPluggabilityServletContext cannot be cast to org.apache.catalina.core.ApplicationContextFacade
at org.jboss.weld.environment.tomcat.WeldForwardingInstanceManager.getStandardContext(WeldForwardingInstanceManager.java:101) ~[weld-servlet-2.4.6.Final.jar:2.4.6.Final]
... 13 common frames omitted
Run Code Online (Sandbox Code Playgroud) 我有一个命令行 Java SE 应用程序,我想对其进行一些现代化改造。我想在其他 CDI 功能中使用拦截器和依赖注入。然而,该应用程序在设计时并未考虑 CDI 或依赖注入,它广泛使用 new 关键字和构造函数参数,而不是将对象创建委托给 DI 容器。CDI/Weld 不会在使用 new 创建的对象上注入依赖项或运行拦截器,它根本无法处理构造函数参数。一个简化的例子:
class Main {
@Inject
private SomeModule someModule;
public static void main (String[] args) {
SeContainer container = ... set up CDI container ...
Main main = container.select(Main.class).get();
main.main(args);
}
@TraceLog
public Main () {
...
}
@TraceLog
public main (String[] args) {
Encryptor = new Encryptor(args[1], args[2], args[3]);
encryptor.run();
}
}
class Encryptor {
@Inject
private SomeModule someModule;
private String inputFile;
private String outputFile;
private …Run Code Online (Sandbox Code Playgroud) 有没有办法用应用程序启动 CDI Bean?
我有这个豆子:
@ApplicationScoped
@Named
public class MyBean implements Serializable {
@Inject
private Helper helper;
@PostConstruct
public void init() {
helper.doThings();
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这个 bean 在部署时与应用程序一起启动。
我正在使用weld-servlet和tomcat7:
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet</artifactId>
<version>${weld-servlet.version}</version>
<scope>compile</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud) 我有: - 存储库类:
@SessionScoped
public class EmployeeRepository {
@PersistenceContext
EntityManager entityManager;
public List<Employee> getEmployees(){
TypedQuery<Employee> qu = entityManager.createQuery("select * from Employee", Employee.class);
List<Employee> emp2 = qu.getResultList();
return emp2;
}
}
Run Code Online (Sandbox Code Playgroud)
和
托管 Bean:
@ManagedBean(name = "helloWorldBean")
public class HelloWorldBean {
@Inject
private EmployeeRepository employeerepo;
public String getMsg() {
return "Hallo";
}
public String getEmployees() {
return String.valueOf(employeerepo.getEmployees().size());
}
}
Run Code Online (Sandbox Code Playgroud)
和一个 JSF 页面:
<h:head>
<title>JavaCodeGeeks</title>
</h:head>
<h:body>
- Message : <h:outputText value="#{helloWorldBean.msg}" />
- Employee count : <h:outputText value="#{helloWorldBean.employees}" />
</h:body> …Run Code Online (Sandbox Code Playgroud) 如果我理解正确,Java CDI 应该独立于 Weld。但是我看到的所有示例都使用 Weld 来初始化容器。
我试图在没有 Weld 的情况下使用 CDI,因为虽然我想使用 DI,但我的内存非常有限。
这是我的 LoggerFactory 的一个例子-
@ApplicationScoped
public class LoggerFactory {
@Produces
@Singleton
public Logger getLogger() {
return LogManager.getLogger("com.myapp");
}
}
Run Code Online (Sandbox Code Playgroud)
我试图在 Main- 中获取它
Logger logger = CDI.current().select(Logger.class).get();
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我得到Unable to locate CDIProvider.
是否可以在没有额外库的情况下使用 CDI?在这种情况下如何获取我的记录器?
在“单一”Jakarta-EE 8 应用程序中,我们希望将 JSF 与 CDI 结合使用。下图给出了视图和类如何相互依赖的示例:
JSF-View -> ViewController -> BeanA --> BeanA1
\-> BeanA2
Run Code Online (Sandbox Code Playgroud)
在本例中,ViewControlleris @Named+ @ViewScoped,所有其他 bean ( BeanA, BeanA1, BeanA2) 都是@SessionScoped。我们希望使用构造函数注入作为最佳实践。基于此,我们的类如下所示:
@Named
@ViewScoped
public class ViewController implements Serializable {
private final BeanA bean;
@Inject
public ViewController(final BeanA bean) {
this.bean = bean;
}
}
@SessionScoped
public class BeanA implements Serializable {
private final BeanA1 bean1;
private final BeanA2 bean2;
@Inject
public BeanA(final BeanA1 bean1, final BeanA2 bean2) …Run Code Online (Sandbox Code Playgroud) 有人可以解释 CDI 范围注释在生产者方面的作用吗?他们似乎没有完成任何事情。
@Produces
public Thing thingMaker() {
System.out.println("Making thingmaker");
return new ThingBean("thingMaker");
}
@Produces
@RequestScoped
public Thing thingMakerReq() {
System.out.println("Making thingmakerReq");
return new ThingBean("thingMakerReq");
}
Run Code Online (Sandbox Code Playgroud)
这些自然会在启动时给出这个(被忽略的)错误。
WELD-001409:Thing 类型的依赖关系不明确。可能的依赖关系:
- 生产者方法 [Thing],其限定符 [@Any @Default] 声明为 [[BackedAnnotatedMethod] @Produces public pkg.test.ThingProducer.thingMaker()],
- 生产者方法 [Thing],其限定符 [@Any @Default] 声明为 [[BackedAnnotatedMethod] @Produces @RequestScoped public pkg.test.ThingProducer.thingMakerReq()]
因此,即使 `RequestScoped 被标记为生产者方法的一部分,它们也不是限定符。
所以我只是不确定他们在生产者方法方面的作用是什么。
有一个问题,从6小时后处理,但没有解决它.
我正在使用JSF/Tomcat 7/Maven/Java 7开发动态Web项目
每次我在服务器上运行项目时都会得到:
javax.naming.NameNotFoundException: Name [....ProjectManagement/service] is not bound in this Context. Unable to find [de.hhn.team3.artzpraxismanagement.ProjectManagement].
at org.apache.naming.NamingContext.lookup(NamingContext.java:820)
at org.apache.naming.NamingContext.lookup(NamingContext.java:168)
at org.apache.catalina.core.DefaultInstanceManager.lookupFieldResource(DefaultInstanceManager.java:580)
at org.apache.catalina.core.DefaultInstanceManager.processAnnotations(DefaultInstanceManager.java:470)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:157)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:150)
at org.apache.myfaces.config.annotation.Tomcat7AnnotationLifecycleProvider.postConstruct(Tomcat7AnnotationLifecycleProvider.java:90)
at org.apache.myfaces.config.ManagedBeanBuilder.buildManagedBean(ManagedBeanBuilder.java:213)
at org.apache.myfaces.el.unified.resolver.ManagedBeanResolver.createManagedBean(ManagedBeanResolver.java:333)
at org.apache.myfaces.el.unified.resolver.ManagedBeanResolver.getValue(ManagedBeanResolver.java:296)
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:67)
at org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:169)
at org.apache.myfaces.el.VariableResolverImpl.resolveVariable(VariableResolverImpl.java:65)
at org.apache.myfaces.el.convert.VariableResolverToELResolver.getValue(VariableResolverToELResolver.java:123)
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:67)
at org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:169)
at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:72)
at org.apache.el.parser.AstValue.getValue(AstValue.java:161)
at org.apache.el.parser.AstEqual.getValue(AstEqual.java:38)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:185)
at org.apache.myfaces.view.facelets.el.ContextAwareTagValueExpression.getValue(ContextAwareTagValueExpression.java:96)
at javax.faces.component._DeltaStateHelper.eval(_DeltaStateHelper.java:263)
at javax.faces.component.UIComponentBase.isRendered(UIComponentBase.java:1089)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:733)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:758)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:758)
at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1900)
at org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:285)
at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:115)
at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:241)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:199) …Run Code Online (Sandbox Code Playgroud)