标签: cdi

weblogic是否支持CDI Beans?

我开始使用weblogic 11g版本10.3.2.0

weblogic是否支持CDI Beans?

谢谢

java-ee weblogic11g cdi

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

确切地说,当@Inject注释在Servlet中启动SessionScoped bean的注入时?

我需要在Servlet中修改用户会话对象(SessionScoped bean-CDI),所以我必须以某种方式获取该bean.我用以下方式注射:

@Inject
private UserSession user;
Run Code Online (Sandbox Code Playgroud)

UserSession是SessionScoped CDI bean.用户方法是从doPost或doGet servlet方法调用的.这很完美; 每次@Inject注释都会注入相应的UserSession bean,但我不明白这种行为是如何实现的.

我假设用@Inject注释的bean只注入一次(当创建对象 - 本例中的Servlet实例时),但这显然是错误的假设.

那么,这些bean什么时候注入到servlet中?按要求?当有多个UserSession对象时,这种方法如何避免冲突(一个servlet实例 - 处理它的多个线程)?

servlets cdi jsf-2

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

使用".properties"文件进行依赖注入

我正在使用Java EE 6,需要从".properties"文件加载配置.是否有推荐的方法(最佳实践)使用依赖注入从配置文件加载值?我在Spring中找到了这个注释,但我还没有找到Java EE的"标准"注释.

这家伙从头开发了一个解决方案:

http://weblogs.java.net/blog/jjviana/archive/2010/05/18/applicaction-configuration-java-ee-6-using-cdi-simple-example

"我找不到一个简单的例子,说明如何通过从文件中读取配置属性来配置CDI应用程序......"

但我想知道是否有更标准的方法而不是创建配置工厂......

configuration annotations dependency-injection cdi java-ee-6

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

sessionContext.getCallerPrincipal()中的NullPointerException

我有一个简单的(webprofile)EJB 3.1应用程序,并尝试确定@ApplicationScopedCDI Bean中的当前用户,所以我使用:

Principal callerPrincipal = this.sessionContext.getCallerPrincipal()
Run Code Online (Sandbox Code Playgroud)

工作正常(所以我可以确定当前用户的名称).

但是在任何(其他)EJB中的任何异常之后,此调用不再起作用(我需要重新启动服务器)!该方法不会返回调用者主体,而是抛出此异常.

Caused by: java.lang.NullPointerException
at com.sun.ejb.containers.EJBContextImpl.getCallerPrincipal(EJBContextImpl.java:421)
at de.mytest.service.CurrentUserService.getCurrentUserId(CurrentUserService.java:102)
Run Code Online (Sandbox Code Playgroud)

有人能给我一个提示我做错了吗?


实施细节:

Server Glassfish 3.1.2

CurrentUserService:

@ApplicationScoped
public class CurrentUserService {

    @Resource
    private SessionContext sessionContext;

 public long getCurrentUserId() {

        if (this.sessionContext == null) {
            throw new RuntimeException("initialization error, sessionContext must not be null!");
        }

 /*line 102 */     Principal callerPrincipal = this.sessionContext.getCallerPrincipal(); 
        if (callerPrincipal == null) {
            throw new RuntimeException("callerPrincipal must not be null, but it is");
        }

        String name = callerPrincipal.getName();
        if …
Run Code Online (Sandbox Code Playgroud)

java ejb glassfish java-ee cdi

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

Tomcat + CDI + Arquillian

我将Tomcat 7和CDI一起使用,为此,我使用了Knappsack Maven Archetypes中的jee6-servlet-minimal-archetype 作为起点.

现在我想使用Arquillian来测试CDI bean,但即使在搜索了很长时间之后,我也只发现了一些与该主题相关的问题.

有人能指出我pom.xml在Tomcat 7上使用Arquillian进行CDI测试的工作设置(特别是使用权)吗?


编辑2012/09/11: 正如下面的评论所指出的,我认为要解决我的问题,我需要有人帮助我理解整个设置,而不是试图在某个时候解决特定的异常.

那么,pom.xml和测试类是如何看待的,因为在tomcat 7中有一个CDI bean并且能够在嵌入式和托管容器中使用所有注入机制来测试它?(顺便说一下,为什么没有tomcat 7的远程容器适配器,因为它已经用于6?)

我已经尝试调整tomcat 6示例,但无法使其在tomcat 7上运行.

maven-3 cdi tomcat7 jboss-arquillian

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

使用Jersey 2.1和CDI

我尝试使用Jersey 2.1,并CDI在我的Java EE 7项目,该项目被部署在Glassfish 4.0.

Jersey模块依赖于Guava库.但是使用带有CDI的Guava库(14.0.1)会导致抛出以下异常.

CDI deployment failure:WELD-001408 Unsatisfied dependencies for type [Set<Service>] with qualifiers [@Default] at injection point [[BackedAnnotatedParameter] Parameter 1 of [BackedAnnotatedConstructor] @Inject com.google.common.util.concurrent.ServiceManager(Set<Service>)].
Run Code Online (Sandbox Code Playgroud)

我怎样才能克服这个问题?

glassfish jersey java-ee guava cdi

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

如何用焊接单元测试CDI?

我想使用weld-se进行单元测试CDI.但是,我坚持这个Weld无法解决bean的问题.我创建了一个小型项目来演示用于构建的gradle问题.

我在文件<project-root>夹中有以下文件:

./build.gradle
./src/main/java/cdi/Book.java
./src/main/resources/META-INF/beans.xml
./src/test/java/cdi/BookTest.java
./src/test/resources/META-INF/beans.xml
Run Code Online (Sandbox Code Playgroud)

下面列出了每个文件的内容.

的build.gradle

apply plugin: 'java'    
repositories {
    mavenCentral()
}    
dependencies {
    compile 'org.jboss.weld.se:weld-se:2.0.4.Final'
    testCompile 'junit:junit:4.11'
}
Run Code Online (Sandbox Code Playgroud)

Book.java

package cdi;    
public class Book {
    private String title;    
    public String getTitle() {
        return title;
    }    
    public void setTitle(String title) {
        this.title = title;
    }
}
Run Code Online (Sandbox Code Playgroud)

BookTest.java

package cdi;
import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class BookTest {
    private static Weld weld;
    private static WeldContainer weldContainer; …
Run Code Online (Sandbox Code Playgroud)

java-ee cdi jboss-weld weld

6
推荐指数
2
解决办法
9186
查看次数

如何注入接口实现?

我有以下界面

public interface IMyMapper<T> {}
Run Code Online (Sandbox Code Playgroud)

和实施

public class MyMapper implements IMyMapper<MyClazz> {}
Run Code Online (Sandbox Code Playgroud)

现在我想将类MyMapper注入无状态bean:

@Stateless
public class MyService {

    @Inject
    MyMapper mapper; //<-- does not work

    @Inject
    IMyMapper<MyClazz> mapper; //<-- also does not work
}
Run Code Online (Sandbox Code Playgroud)

我的问题是注射不起作用.我得到一个例外:

org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies    for type MyMapper with qualifiers @Default
at injection point [BackedAnnotatedField] @Inject mypackage.MyService.mapper
at mypackage.MyService.mapper(MyService.java:0)

at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:370)
at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:291)
at org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:134)
at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:165)
at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:529)
at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:515)
at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:490)
at org.jboss.weld.bootstrap.WeldStartup.validateBeans(WeldStartup.java:419)
at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:90)
at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:225)
at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:131)
at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:328)
at …
Run Code Online (Sandbox Code Playgroud)

java java-ee cdi java-ee-7

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

使用焊接与Dropwizard

我试图在dropwizard应用程序中使用Weld-SE进行依赖注入.我可以引导Weld并在Application类中注入,如下所示:

public class App extends Application<AppConfig> {

  @Inject NameService service;
  @Inject RestResource resource;

  public static void main(String[] args) throws Exception {
    Weld weld = new Weld();
    WeldContainer container = weld.initialize();
    App app = container.instance().select(App.class).get();     
    app.run(args);
    weld.shutdown();
  }
}
Run Code Online (Sandbox Code Playgroud)

我已经在RestResource的一个单独的类中编写了一个生成器方法,这也是很好的注入.但是在资源类中,不会注入服务:

@Path("/test")
@Produces(MediaType.APPLICATION_JSON)
public class RestResource {
    @Inject NameService service;

    @GET
    public String test() {
        return service.getName();
    }
}
Run Code Online (Sandbox Code Playgroud)

此服务始终为空.有谁知道如何使这项工作?

java cdi dropwizard weld

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

由于公共私人领域的矛盾,使用Junit @Rule的CdiUnit测试是不可能的

以下代码段足以重现我的问题:

  • 我设置thrown属性public并获取错误org.jboss.weld.exceptions.DefinitionException: WELD-000075: Normal scoped managed bean implementation class has a public field
  • 或者我删除public修饰符并获取错误org.junit.internal.runners.rules.ValidationError: The @Rule 'thrown' must be public.
  • 我还试图让public修饰符到位并@Dependent在类上添加注释范围,但是出现了错误org.jboss.weld.exceptions.DefinitionException: WELD-000046: At most one scope may be specified on [EnhancedAnnotatedTypeImpl] public @Dependent @ApplicationScoped @RunWith

我删除了所有不必要的代码,但这是一个非常复杂的单元测试,通过CDI进行模拟,服务注入,并且一些测试方法预计会引发异常.

import org.jglue.cdiunit.CdiRunner;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;

@RunWith(CdiRunner.class)
public class FooBarTest {

    @Rule
    public ExpectedException thrown = ExpectedException.none();

    @Test
    public void test() {

    }
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,一方面Weld希望所有字段都不公开,因为否则它将无法代理该类,另一方面,JUnit希望规则字段是公共的,因为它使用反射来访问它们setAccessible(true)由于安全管理器处于活动状态,因此不希望使用该方法.如何处理这个悖论? …

java junit cdi junit-rule cdi-unit

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