标签: cdi

我可以(以及如何)使用EJB模块中的javax.naming.Context#lookup查找CDI托管bean吗?

我可以(如果是这样,如何?)javax.naming.Context#lookup在EJB模块中查找CDI托管bean ?

我正在使用GlassFish v3.我想我可以使用@Named,但是什么是CDI托管bean的JNDI名称?我想从非托管POJO中查找它们,所以我无法使用@Inject.

java ejb glassfish cdi ejb-3.1

16
推荐指数
2
解决办法
2万
查看次数

我可以为EJB使用CDI构造函数注入吗?

我想做这样的事情:

@Stateless
public class GreeterEjb {


    private final Greeter greeter;


    @Inject
    public GreeterEjb(Greeter greeter) {
        this.greeter = greeter;
    }


    public String greet() {
        return greeter.greet();
    }
}
Run Code Online (Sandbox Code Playgroud)

我用Glassfish 3.1.1和JBoss 7.0.2尝试了混合结果.在某些情况下,它可以工作,在其他情况下则不然.如果您对详细信息感兴趣,请参阅Glassfisch论坛中的此主题.

EJB 3.1规范,部分4.9.2 bean类说:

该类必须具有不带参数的公共构造函数.

这听起来像EJB不允许构造函数注入.

CDI规范在第3节开头说,会话Bean受CDI支持.然后,第3.2节详细讨论了CDI和EJB,但从未提及有关构造函数注入不起作用的任何内容.这让我觉得它应该被允许.

那么,这些规范是否允许为EJB提供CDI构造函数注入?

java ejb cdi

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

在注入点使用限定符[@Default]的类型[...]的不满意依赖(使用带有CDI的@Stateful EJB)

我有以下代码来管理两种存储库.两个存储库类都继承一个接口以允许重新初始化其资源.

public interface CachingRepository
{
    public void invalidateCache();
}
Run Code Online (Sandbox Code Playgroud)

全局,应用程序范围的回购:

@Named("globalRepo")
@ApplicationScoped
public class GlobalRepository implements CachingRepository
{
    private List<Category> categories;

    ...

    @Override
    public void invalidateCache()
    {
        categories = null;
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

每个用户,会话范围的回购:

@Named("userRepo")
@SessionScoped
//@Stateful         // <- NOTE HERE
public class UserRepository implements CachingRepository, Serializable
{
    private List<MyFile> files;

    @Override
    public void invalidateCache()
    {
        files = null;
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

将此(不@Stateful)注入上下文时

@Named
@ViewScoped
public class MyHandler implements Serializable
{
    @Inject
    private UserRepository userRepo;

    ...
}
Run Code Online (Sandbox Code Playgroud)

有用.但是,在添加 …

java cdi seam3 ejb-3.0 java-ee-6

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

在CDI容器中手动注册类

我有一组通过反射实例化的类,因此这些类不由CDI容器管理,并且上下文不进行注入.我的问题是,有没有办法在CDI上下文中注册这些类,所以这些类是由上下文管理的?

贝娄,我是如何创建课程的:

String clazz = "org.myorg.thisIsMyClass";
MyClass myClass = Class.forName(clazz).newInstance(); // myClass instance not managed by CDI
Run Code Online (Sandbox Code Playgroud)

如何制作myClassCDI容器管理的实例?

java cdi

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

如何使用Weld轻松注入String常量?

我们有一种情况,我们以Map的形式为我们正在运行的程序提供外部配置.我发现JSR-330依赖注入提供了一种更清晰的方式来在代码中使用该配置映射,而不是传递映射或使用JNDI来获取它.

@Inject @Named("server.username") String username;
Run Code Online (Sandbox Code Playgroud)

让JSR-330实现自动填写此字段.

使用Guice,我可以设置值

bindConstant().annotatedWith(Names.named(key)).to(value);
Run Code Online (Sandbox Code Playgroud)

我希望能够在Weld中做同样的事情(将"server.username"绑定到例如"foobar")并且我理解该机制最有可能是beans.xml,但我更喜欢简单的"将此地图提供给Weld" ,请"代码替代.这样做有什么好办法?


编辑2013-10-16:在调查Dagger,它在编译时工作而不是运行时,我发现我们通常每个程序有10-20个,我们可以使用@Provider每个配置字符串的方法,然后在配置中查找地图.这允许方法特定的行为(包括默认值),提供javadoc的能力,以及将所有这些方法放在同一个类中的能力.它也可以与Weld开箱即用.我正在考虑在博客文章中写一个更全面的解释.

java jsr299 jsr330 cdi jboss-weld

15
推荐指数
2
解决办法
6867
查看次数

如何避免jsf中的BusyConversationException

我在浏览jsf项目中的页面时遇到BusyConversationException.如果用户在ajax调用期间尝试导航到另一个页面,则通常会发生这种情况.当用户在单击另一个链接后立即单击链接而不等待加载页面时,也会发生这种情况.

例如,如果用户点击通过类似于下面的代码生成的多个链接,我们肯定会得到此异常.另一个例子是,假设用户在文本字段上输入查询,我们的应用程序进行ajax调用以搜索此查询.在该查询期间,如果用户单击某个按钮以导航到另一个页面,则也会发生BusyConversationException.

<h:commandLink value="#{theProfile.profileName}"
               title="#{theProfile.profileName}"
               action="#{profileBean.aProfileSelected}">
               <f:setPropertyActionListener target="#{currentProfileWebBean.theProfile}" value="#{theProfile}"/>
</h:commandLink>
Run Code Online (Sandbox Code Playgroud)

我能赶上在一个延伸ExceptionHandlerWrapper类中的ExceptionHandler类这种类型的异常,但我不能挽救我目前的状态,我可以为这种情况下做的最好的是,当这个例外发生时重定向到主页.

有没有解决方案来避免这种情况?提前感谢您的回答和评论.

jsf exception-handling cdi conversation-scope weld

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

Java EE 6:@Inject和Instance <T>

我对@Injectjava ee 6中的注释有疑问:

有什么区别:

@Inject
private TestBean test;

@Inject
private Instance<TestBean> test2;
Run Code Online (Sandbox Code Playgroud)

要参考:

test2.get();
Run Code Online (Sandbox Code Playgroud)

关于Instance的一些信息:http://docs.oracle.com/javaee/6/api/javax/enterprise/inject/Instance.html

也许在get()调用之前它不会创建对象?我只是想知道哪一个更适合jvm内存.我认为direct @Inject会直接创建一个对象的实例,即使它没有被appplication使用...

谢谢 !

dependency-injection ejb javabeans cdi java-ee-6

14
推荐指数
2
解决办法
7613
查看次数

从线程调用bean时,范围类型javax.enterprise.context.RequestScoped没有活动的上下文

使用Weld-SE 2.1.2.Final获取bean并从线程调用它时,我遇到以下异常:

线程"main"中的异常org.jboss.weld.context.ContextNotActiveException:WELD-001303:范围类型javax.enterprise.context.RequestScoped没有活动的上下文

我的bean用@RequestScooped注释.如果我注释@ApplicationScoped然后它工作正常,但我需要保留@RequestScooped.

这是一个复制者:

public static void main(String[] args) throws Exception {
    Weld weld = new Weld();
    WeldContainer container = weld.initialize();
    final MyPojo pojo = container.instance().select(MyPojo.class).get();

    Thread t = new Thread() {
        public void run() {
            System.out.println(pojo.ping());   // This call fails
        }
    };
    t.start();
    t.join();
    System.out.println(pojo.ping()); // This call succeed
    weld.shutdown();

}

@RequestScoped
public class MyPojo {
 public String ping() {
    return "pong";
 }
}
Run Code Online (Sandbox Code Playgroud)

你遇到过这种行为吗?有什么想让这个工作好吗?

java multithreading cdi weld-se

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

对于带有限定符@Default的类型X的不满意依赖项

我正在尝试Greeter在Wildfly 8.2内部运行的EJB上注入给定类型()的对象.但是,部署始终会失败并显示消息

Unsatisfied dependencies for type Greeter with qualifiers @Default
Run Code Online (Sandbox Code Playgroud)

我试图用注释GreeterImpl和注入点注释,@Default但这也没有用.我在这里错过了什么吗?

我的Greeter界面:

public interface Greeter {
    public void sayHi();
}
Run Code Online (Sandbox Code Playgroud)

我的GreeterImpl班级(唯一实施的班级Greeter):

public class GreeterImpl implements Greeter {
    private static final Logger LOGGER = LoggerFactory.getLogger(GreeterImpl.class);

    @Override
    public void sayHi() {
        LOGGER.info("Hi!");
    }
}
Run Code Online (Sandbox Code Playgroud)

我的ScheduledGreeterEJB:

@Stateless
public class ScheduledGreeter {
    @Inject
    private Greeter greeter;

    @Schedule(second = "*/15", minute = "*", hour = "*")
    public void sayHi() {
        greeter.sayHi(); …
Run Code Online (Sandbox Code Playgroud)

code-injection java-ee cdi

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

Java CDI:具有多个通用参数的装饰器

我有以下结构:

@Decorator
public abstract class MyDecorator<T extends BaseEntity, Q extends QueryParams> implements EntityService<T, Q> {

    @Any
    @Inject
    @Delegate
    EntityService<T, Q> delegate;

    @Override
    public T save(T entity) { ... }

} 
Run Code Online (Sandbox Code Playgroud)

这是EntityService接口声明:

public interface EntityService<T extends BaseEntity, Q extends QueryParams> {

    T save(T entity);

    void deleteById(Integer id);

    void deleteAllById(List<Integer> ids);

    void delete(T entity);

    void deleteAll(List<T> entities);

    T findById(Integer id);

    QueryResultWrapper<T> query(Q parameters);

    Long count(Q parameters);

}
Run Code Online (Sandbox Code Playgroud)

不幸的是,装饰器保存方法永远不会被调用,虽然没有显示错误...我得到它的唯一方法是这样:

@Decorator
public abstract class MyDecorator<T extends BaseEntity> implements EntityService<T> { ... } …
Run Code Online (Sandbox Code Playgroud)

java generics decorator cdi

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