假设我有两个类,首先是一个没有任何属性,字段或注释的类:
public class B {}
Run Code Online (Sandbox Code Playgroud)
和一个注入B的类,如下所示:
public class A {
@Inject
private B b;
public B getB() {
return b;
}
}
Run Code Online (Sandbox Code Playgroud)
现在A级在我们使用之前是没用的,所以有两种选择:
如果A被注入,CDI管理它并且足够注入B,其具有隐含的@Dependent范围.很酷,就是我想要的.
但是,如果我手动构造A(假设在工厂或构建器中),CDI完全忽略我的对象并且不会注入类型B的对象.
示例我在谈论它什么时候不起作用,这里对象a将始终保持为null:
public class Builder {
@Inject
private A a;
public static Builder ofTypeSomething() {
// do some magic here
return new Builder();
}
private Builder() {
// and some more here
}
}
Run Code Online (Sandbox Code Playgroud)
为什么这不起作用?
A类是一个有效的托管bean,并且有一个有效的范围,就像B类一样.即使我将@Producer添加到静态方法,它也不会改变任何东西(这很好,因为静态方法的想法是调用它,不要在任何地方注入Builder).
我希望以这种方式注入配置参数:
public class MyManagedBean {
@Inject
public MyManagedBean(@Named("user") String user){
....
}
}
Run Code Online (Sandbox Code Playgroud)
所以我尝试用这种方式实现一个生成器方法:
@ApplicationScoped
public class MyConfiguration {
private Properties loadProperties() {
Properties properties = new Properties();
try {
properties.load(getClass().getResourceAsStream(
"user.properties"));
} catch (IOException e) {
throw new RuntimeException();
}
return properties;
}
@Produces
@Named("user")
String getUser() {
return loadProperties().getProperty("user");
}
}
Run Code Online (Sandbox Code Playgroud)
我有这样定义的其他bean:
public class OtherManagedBean {
@Inject
public OtherManagedBean(MyManagedBean myManagedBean){
....
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试部署它时,我遇到了这个异常:
INFO: WEB0671: Loading application [example-ear#example-war.war] at [example]
SEVERE: Exception while loading the app
SEVERE: …Run Code Online (Sandbox Code Playgroud) 我正在测试/切换到Java EE7(Glassfish 4),我遇到的一个问题是拦截器,每当我尝试运行项目时,我都会收到以下错误.
严重:加载应用程序时出现异常:CDI部署失败:WELD-001417文件中启用拦截器类com.xxxxxx.security.SecuredInterceptor:/home/xxxxxx/xxxxxx/target/xxxxxx/WEB-INF/beans.xml@7既不是注释@Interceptor也没有通过便携式扩展注册
我正在看CDI 1.1规范的1.3.6节,它看起来没什么变化,所以我做错了什么?
这是我正在使用的代码;
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Secured {}
Run Code Online (Sandbox Code Playgroud)
@Secured
@Interceptor
public class SecuredInterceptor implements Serializable
{
@AroundInvoke
public Object interceptSecured(InvocationContext ic) throws Exception
{
// Do Stuff
}
}
Run Code Online (Sandbox Code Playgroud)
<?xml version="1.0" encoding="UTF-8"?>
<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"
bean-discovery-mode="annotated">
<interceptors>
<class>com.xxxxxx.security.SecuredInterceptor</class>
</interceptors>
</beans>
Run Code Online (Sandbox Code Playgroud) 我在JBoss EAP 6上使用Java EE 6,我的JSF bean注释如下:(
@ManagedBean @ViewScoped两者都来自javax.faces.bean包)
然而,他们也CDI豆(默认构造函数,使用@Inject,@PreDestroy等等).我一直在阅读你不能混合这些注释(JSF和CDI),但它显然工作正常:注入正在工作,preDestroy在视图更改时被调用等).
我错过了什么吗?问题是什么?为什么不用?
我想用mockito测试一些服务.这些服务基于CDI,不幸的是,使用现场注入,我无法改变.
public class Service {
@Inject Logger logger;
public void method() {
logger.info("some log text");
}
}
Run Code Online (Sandbox Code Playgroud)
现在使用mockito的@InjectMocks注释创建可测试的实例非常容易.它将注入嘲笑和间谍.
@RunWith(MockitoJUnitRunner.class)
public class ServiceTest {
@Spy Logger logger = LoggerFactory.getLogger(Service.class);
@InjectMocks Service service;
@Test public void test() {
// Given
// When
service.method();
// Then
}
Run Code Online (Sandbox Code Playgroud)
我需要将一些工作记录器注入我正在测试的服务类中.记录器框架是slf4j,首选记录器是logback.但不幸的Logger是,logback的实现是最终的,所以我不能窥探它,它会导致运行时异常.
我想到的解决方法:
但对于那些(那些)问题,是否有一个干净或至少更好的解决方案?
所以,我有一个使用Weld 1.2进行依赖注入的基本Java SE程序.
一切正常,直到我将Hibernate放入混合中,并使用以下pom.xml依赖项:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
<dependency>
<groupId>org.jboss.weld.se</groupId>
<artifactId>weld-se</artifactId>
<version>2.2.4.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.6.Final</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
Hibernate是添加的依赖项,使其中断.这是我的入门课程:
public class EntryPoint {
public static void main( String[] ARGV ) {
Weld weld = new Weld();
WeldContainer container = weld.initialize();
Application application = container.instance().select(Application.class).get();
application.testFetch();
weld.shutdown();
}
}
Run Code Online (Sandbox Code Playgroud)
当我在包含Hibernate依赖项后尝试运行它时,这是我的输出:
Sep 11, 2014 11:13:44 PM org.jboss.weld.bootstrap.WeldStartup <clinit>
INFO: WELD-000900: 2.2.4 (Final)
Sep 11, 2014 11:13:44 PM org.jboss.weld.bootstrap.WeldStartup startContainer
INFO: WELD-000101: Transactional services not available. Injection of @Inject UserTransaction not available. …Run Code Online (Sandbox Code Playgroud) 使用Wildfly 8.1我有几个bean,我尝试将几个EJB互相注入.可以说我有3个豆子:
@Stateless
public class A{
@Inject
private B b;
}
@Stateless
public class B{
@Inject
private C c;
}
@Stateless
public class C{
@Inject
private A a;
}
Run Code Online (Sandbox Code Playgroud)
显然,我有循环依赖.根据规格:
容器需要支持bean依赖关系图中的循环,其中参与每个循环依赖关系的至少一个bean具有正常范围
在容器中的代码上运行会导致表单错误:
org.jboss.weld.exceptions.DeploymentException:WELD-001443:伪范围bean具有循环依赖关系.依赖路径:
-Session bean [带有限定符的A类[@Default @Any]; 本地接口是[A] BackedAnnotatedField] @Inject private B,
[..]
我的问题是:@Stateless bean的范围是什么?它默认是@Dependent吗?最重要的是我如何在无状态会话bean之间启用循环依赖?
对不起,如果这个问题太琐碎了.我将非常感谢任何可以解释所呈现行为的进一步阅读资源.提前致谢.
更新 好了.我找到了解决方法.我使用@EJB注释而不是@Inject,但这并没有解释@Inject的奇怪行为.这个问题仍未解决,但正如Mika所说,CDI规范和Weld RI都可能是未解决的问题.
我知道无状态会话Bean是指EJB bean,而Request Scoped是指CDI bean(或JSF托管bean),因此我将首先从Java EE Tutoriel中提供它们的两个定义.
无状态会话Bean定义:
无状态会话bean不与客户端保持会话状态.当客户端调用无状态bean的方法时,bean的实例变量可能包含特定于该客户端的状态,但仅限于调用期间.方法完成后,不应保留特定于客户端的状态.
CDI Request Scoped定义:
用户在单个HTTP请求中与Web应用程序的交互.
我从这两个定义中理解的是,无状态会话bean的概念与请求范围概念相同,但我不确定,因为命名"会话"使我感到困惑.所以,我问自己是否是这种情况(相同的概念),也许他们会有类似的命名(使用请求而不是会话).
所以,我的问题是:EJB无状态会话bean和CDI/JSF请求范围bean之间是否有任何概念上的区别?
有一个以上的例子,我从一个以openshift原点运行的pod中看到了这个状态.在这种情况下,这是cdi camel示例的快速入门.我能够在本地成功构建和运行它(非openshift)但是当我尝试在我的本地openshift(使用mvn -Pf8-local-deploy)上部署时,我得到了这个特定示例的输出(为了相关性而剪断): -
[vagrant@vagrant camel]$ oc get pods
NAME READY STATUS RESTARTS AGE
cdi-camel-z4czs 0/1 CrashLoopBackOff 4 2m
日志尾巴如下: -
Error occurred during initialization of VM
Error opening zip file or JAR manifest missing : agents/jolokia.jar
agent library failed to init: instrument
Run Code Online (Sandbox Code Playgroud)
有人可以帮我解决这个问题吗?
我正在尝试将Jersey项目从2.25更新到2.27。
从2.26版开始,Jersey是Java EE 8的一部分,因此我还决定将我的项目从Java EE 7更新到Java EE 8,并从JAX-RS 2.0 / CDI 1.x / Weld2.x / Apache Tomcat 8更新到JAX-RS 2.1 / CDI 2.0 / Weld 3.0 / Apache Tomcat 9。
问题是我无法弄清楚我需要在项目(Maven项目,pom.xml)中包含的确切依赖项。
我尝试过的事情:
cdi-api,jersey-hk2,javax.inject,jersey-cdi1x,jersey-cdi1x-servlet,weld-servlet,weld-servlet-core,weld-servlet-shaded,weld-core-impl这些是我当前的依赖项(pom.xml):
<!-- Java EE -->
<dependency> …Run Code Online (Sandbox Code Playgroud)