标签: cdi

CDI可以减少对Java SE的影响吗?

JSR-330依赖注入可以应用于Java SE和Java EE环境,而JSR-299则标题为"Java EE平台的上下文和依赖注入".

除了严格的面向Java EE的功能外,哪些CDI功能在Java SE上也有意义?有可用的例子吗?谢谢!

[修订]这是关于JSE焊接.

java dependency-injection java-ee cdi jboss-weld

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

@Inject通过URL将params传递给CDI @Named bean

如果我不能将@ManagedProperty注释与@Named一起使用,因为@ManagedProperty在CDI(?)中不起作用,那么如何将URL中的params传递给facelets客户端?在我的代码中,我想通过"后退"和"前进"按钮将javax.mail.getMessageNumber()传递给details.xhtml.

我知道应该使用@Inject,但是注入的是什么,请问?

从glassfish日志中,id总是0,这很奇怪.即使单击"前进",无论单击按钮多少次,ID都不会超过1.当然,这仅仅是问题的症状.当然,所需的输出是前进到下一个消息.

也许将Message或者至少是int放入会话中?

客户端如此:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
                template="./template.xhtml"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:c="http://java.sun.com/jsp/jstl/core"
                xmlns:f="http://java.sun.com/jsf/core">
    <ui:define name="top">
        <h:form>
            <h:form>
                <h:outputLink id="link1" value="detail.xhtml">
                    <f:param name="id" value="#{detail.back()}" />
                    <h:outputText value="back" />
                </h:outputLink>
            </h:form>
        </h:form>
        <h:form>
            <h:outputLink id="link1" value="detail.xhtml">
                <f:param name="id" value="#{detail.forward()}" />
                <h:outputText value="forward" />
            </h:outputLink>
        </h:form>
    </ui:define>
    <ui:define name="content">
        <h:outputText value="#{detail.content}"></h:outputText>
    </ui:define>
</ui:composition>
Run Code Online (Sandbox Code Playgroud)

和bean一样:

package net.bounceme.dur.nntp;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.enterprise.context.RequestScoped;
import javax.faces.bean.ManagedProperty;
import javax.inject.Named;
import javax.mail.Message;

@Named
@RequestScoped
public class Detail …
Run Code Online (Sandbox Code Playgroud)

jsf facelets cdi managed-property

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

了解多模块应用程序中的CDI/Weld

我有一个包含在EAR中的应用程序,其中包含许多JAR(包含EJB,库,第三方库,......)和单个WAR(同样包含其他一些JAR).该应用程序部署在JEE7容器(Wildfly 8.0.0.Final)中,并使用CDI(Wildfly随附的Weld 2.1.2.Final).

根据我的理解,Weld在应用程序范围内是活跃的,并且具有单一的应用程序范围视图.所以我想在哪里使用CDI并不重要 - 它有效.

但有一些迹象表明这种情况并非如此.例如,toString所述的-method BeanManager的节目在不同的模块不同的输出:

BeanManager我在战争中打包的某个模块中使用时,我得到了 Weld BeanManager for test-ear-1.0-SNAPSHOT.ear/test-webui-frontend-1.0-SNAPSHOT.war/WEB-INF/lib/test-webui-backend-1.0-SNAPSHOT.jar [bean count=76].

如果它在EAR中直接包含的库中使用: Weld BeanManager for test-ear-1.0-SNAPSHOT.ear/test-ejb3-dao-1.0-SNAPSHOT.jar/ [bean count=224].

所以它们似乎BeanManagers"负责"应用程序的不同部分.这是真的?

java cdi weld

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

WELD + GF4 + SessionScoped:有时错误的bean?


TL; DR我们@SessionScoped注入了具有另一个会话内容的bean实例


最近我们遇到了两个客户系统的严重问题.我们的客户在具有WELD 2.0.5的Glassfish 4.0服务器的两台机器上运行相同JSF 2.2应用程序的两个独立实例(因内存泄漏而欢呼!).

一些用户一直在报告问题,例如在提交表单后,响应显示的用户名与最初登录的用户名不同.由于我们无法在开发和测试环境中重现此行为,因此我们开始从生产中获取日志数据系统.

我们记录了什么?

在我们第一次尝试时,我们开始记录哪个用户在某个时间从哪个客户进行了哪个操作.爬过日志后,我们发现了如下序列:

Time Client   User   Action
.............................
t=0  ClientA  UserA  Login
t=1  ClientA  UserA  Logoff
t=2  ClientB  UserB  Login
t=3  ClientB  UserB  ActionA
t=4  ClientB *UserA* ActionB
t=5  ClientB  UserB  Logoff
Run Code Online (Sandbox Code Playgroud)

User A在更换发生之前,替换用户(此处)的会话并不总是结束(有时会导致一个用户注销另一个用户......).那么当前登录的用户存储在哪里?我们将它作为属性存储在@SessionScopedbean中,@RequestScoped只要我们需要这些信息,就会将其存入bean中.这导致我们认为@SessionScoped豆类有时会混淆的理论.

@Named
@javax.enterprise.context.SessionScoped
public class SessionStateBean {
  private User user;

  public void setUser(...) { }
  public User getUser() { }
}
Run Code Online (Sandbox Code Playgroud)

因此,在第二次尝试时,我们通过以下功能扩展了日志数据:

  • 我们开始在HTTP会话中存储用户名,并在每个请求中将其与来自@SessionScopedbean 的值进行比较.
  • @SessionScopedbean的每个实例都接收到自己的UUID,并在构造和销毁bean以及更改用户属性时记录.我们知道@SessionScopedbean有可能有多个代理,被钝化等等,但我们试了一下.

关于第一个日志功能,我们开始看到序列显示来自会话范围bean的用户名与存储在HTTP会话中的值之间的实际差异: …

session jsf glassfish cdi weld

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

处理CDI中的循环依赖

我有这样的情况.我看不到任何错误,但我没有得到我的结果.

@ApplicationScoped
public class A {

    private B b;


    @Inject
    public A(B b) {
        this.b = b;
    }
}

@Singleton
public class B {

    private A a;


    @Inject
    public B(A a) {
        this.a = a;
    }
}
Run Code Online (Sandbox Code Playgroud)

这种类型的依赖注入是错误的吗?

谁能帮我这个.

java dependency-injection cdi

7
推荐指数
2
解决办法
3426
查看次数

集成测试期间与 Weld 的依赖关系不满足

我能够部署一个与 Weld 配合良好的 RESTEasy 应用程序(这意味着我的 CDI 可以工作),但我在集成测试中遇到了一些问题。我收到此错误:

org.jboss.weld.exceptions.DeploymentException:
WELD-001408: Unsatisfied dependencies for type SomeService with qualifiers @Default
Run Code Online (Sandbox Code Playgroud)

测试时:

@RunWith(WeldJUnit4Runner.class)
public class SomeServiceIT {

    @Inject
    private SomeService service;

    @Test
    public void test() {
        System.out.println(service);
    }
}
Run Code Online (Sandbox Code Playgroud)

我日志中的最后一条消息是

DEBUG::WELD-000100: Weld initialized. Validating beans
Run Code Online (Sandbox Code Playgroud)

src/test/resources/META-INF/beans.xml 的内容:

<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"
    version="1.1" bean-discovery-mode="all">
</beans>
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我尝试了该cdi-unit库并且它可以工作,但我需要使用我自己的库WeldJUnit4Runner,目前是:

public class WeldJUnit4Runner extends BlockJUnit4ClassRunner {

    private final Weld weld;
    private final WeldContainer container;

    public WeldJUnit4Runner(Class<?> klass) throws InitializationError {
        super(klass);
        this.weld = new …
Run Code Online (Sandbox Code Playgroud)

testing integration-testing cdi jboss-weld weld

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

将faces-config.xml从2.2更改为2.3会导致javax.el.PropertyNotFoundException:无法到达目标,标识符“ bean”解析为null

具有以下代码段:

豆:

import javax.faces.view.ViewScoped;
import javax.inject.Named;

@Named(value = "directoryBean")
@ViewScoped
public class DirectoryBean implements Serializable {

private static final long serialVersionUID = 1L;
    ....
}
Run Code Online (Sandbox Code Playgroud)

faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    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/web-facesconfig_2_3.xsd"
    version="2.3">
     ....
</faces-config>
Run Code Online (Sandbox Code Playgroud)

group.xhtml

<ui:composition ...>

    <f:metadata>
        <f:viewParam name="id" value="#{directoryBean.id}" />
    </f:metadata>

</ui:composition>
Run Code Online (Sandbox Code Playgroud)

结果得到异常:

javax.el.PropertyNotFoundException: /group.xhtml @6,64 value="#{directoryBean.id}": Target Unreachable, identifier 'directoryBean' resolved to null
Run Code Online (Sandbox Code Playgroud)

在将faces-config.xml从2.2版语法更改为2.3版语法后得到了它。

意思是,使用带有以下内容的faces-config.xml,一切正常:

<faces-config version="2.2" 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/web-facesconfig_2_2.xsd">
....
</faces-config>
Run Code Online (Sandbox Code Playgroud)

JSF 2.3.2部署在Payara 4.1.2.172(完整)服务器上,并且还添加到pom.xml中,“提供”范围。

....
<dependencies>
    ...
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.faces</artifactId>
        <version>2.3.2</version>
        <scope>provided</scope> …
Run Code Online (Sandbox Code Playgroud)

jsf faces-config cdi jsf-2.3 propertynotfoundexception

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

@PostConstruct和继承的顺序

假设我们有以下课程

public abstract class AbstractFoo {

    @PostConstruct
    private void doIt() {
       //
    }
}

public class Foo extends AbstractFoo {

    @PostConstruct
    private void doIt() {
       //
    }
}
Run Code Online (Sandbox Code Playgroud)

何时调用 AbstractFoo.doIt() 和 Foo.doIt() - 顺序是什么?

java dependency-injection cdi jakarta-ee

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

CDI.current().select().get() 和 BeanManager.getReference() 在功能上是否相同?

在 JEE/CDI 的上下文中,当我需要从方法中静态检索 CDI 托管 bean 时,我发现自己通常使用 CDI 静态函数。例如:

MyBean myBean = CDI.current().select( MyBean.class ).get()
Run Code Online (Sandbox Code Playgroud)

但是,据我所知,实现此目的的另一种等效方法是使用 BeanManager:

BeanManger bm = new InitialContext().lookup( "java:comp/BeanManager" );
Bean<?> bean = bm.resolve(bm.getBeans( MyBean.class ) );
CreationalContext<?> context = bm.createCreationalContext(bean);
MyBean myBean = bm.getReference(bean, cls, context);
Run Code Online (Sandbox Code Playgroud)

那么除了使用该CDI.current()方法编写的代码显着减少之外,使用它还有什么区别?似乎恢复使用BeanManager是一种更复杂(并且可能容易出错?)的方法。从功能的角度来看,使用该CDI.current()方法有什么缺点吗?是否CDI...select()只有一个工作@ApplicationScope豆?或者我也可以与其他作用域 bean(例如:)一起使用@Dependent吗?

我记得使用 CDI 方法阅读了一些关于潜在内存泄漏的内容,但不明白如何或为什么会出现这种情况。

java cdi jakarta-ee

7
推荐指数
2
解决办法
3886
查看次数

如何在 Quarkus 中读取环境变量

我正在尝试使用 读取 Quarkus 应用程序中的环境变量@ConfigProperty,但未能做到这一点。我认为仅指定变量名称就足够了,但它不起作用:

@ConfigProperty(name = "MY_ENV_VAR")
String envVar;
Run Code Online (Sandbox Code Playgroud)

我还尝试在 application.properties 中指定一个属性

my.var=${MY_ENV_VAR:defaultValue}
Run Code Online (Sandbox Code Playgroud)

并读它就像

@ConfigProperty(name = "my.var")
String myVar;
Run Code Online (Sandbox Code Playgroud)

但变量始终为空。

我错过了什么?在 Quarkus 中读取环境变量的正确方法是什么?
我正在使用 Quarkus 1.2.0.Final

java cdi quarkus

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