标签: cdi

注入EntityManager始终为null

我正在尝试使用 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)

java jpa cdi weld

1
推荐指数
1
解决办法
4884
查看次数

Spring Boot 环境中的 Bootstrap Weld

有谁知道在带有嵌入式 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)

tomcat cdi weld spring-boot

1
推荐指数
1
解决办法
2701
查看次数

如何强制 CDI/Weld 使用 new 关键字?

我有一个命令行 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)

java spring dependency-injection cdi weld

1
推荐指数
1
解决办法
1050
查看次数

随应用程序启动的 CDI bean

有没有办法用应用程序启动 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)

java tomcat cdi

1
推荐指数
1
解决办法
415
查看次数

将 @SessionScoped CDI bean 注入 JSF @ManagedBean 后实例为 null

我有: - 存储库类:

@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)

jsf inject cdi

1
推荐指数
1
解决办法
933
查看次数

在没有焊接的情况下初始化 Java CDI?

如果我理解正确,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?在这种情况下如何获取我的记录器?

java dependency-injection cdi weld

1
推荐指数
1
解决办法
550
查看次数

CDI / WELD 构造函数注入最佳实践

在“单一”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)

java cdi weld java-ee-8 jakarta-ee

1
推荐指数
1
解决办法
796
查看次数

CDI 范围和生产商

有人可以解释 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 被标记为生产者方法的一部分,它们也不是限定符。

所以我只是不确定他们在生产者方法方面的作用是什么。

java cdi weld

1
推荐指数
1
解决办法
532
查看次数

与JSF一起使用@Entity,用JPA坚持"hello world"

Oracle非常清楚地描述了如何制作@Entity.但是,我并不完全清楚如何实际添加/删除表.我也喜欢玫瑰印度的解释,但只是想澄清一般的想法.

对于带有CDI的JSF JEE6应用程序,我基本上可以创建一个@Entity类,在@Named bean中实例化一些实例,并使用来自bean的EntityManager将(CRUD操作)写入MySQL数据库?我可以使用Glassfish附带的默认JPA吗?

我想在开始之前澄清一般的想法.

java jsf ejb jpa cdi

0
推荐指数
1
解决办法
539
查看次数

引发者:javax.naming.NameNotFoundException - 名称[Class/object]未绑定在此Context中

有一个问题,从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)

jsf tomcat ejb java-ee cdi

0
推荐指数
1
解决办法
2568
查看次数