标签: cdi

Java EE 6 CDI实现之间的差异

我查看了JBoss的JSR-299上下文和依赖注入的焊接参考实现,我想知道其他CDI实现如何相互比较.具体来说,我了解Weld,Resin CanDI(由Caucho)和Apache OpenWebBeans.

resin java-ee cdi java-ee-6 jboss-weld

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

我如何使用@ConversationScoped

我正在编写一个JSF 2.0应用程序,我想使用CDI注释而不是"等效"JSF注释.换句话说,@ Model或@Named代替@ManagedBean,而@Inject代替@ManagedProperty.

我唯一无法工作的是@ViewScoped,它是AJAX组件所必需的.唯一可靠的解决方法是使用@SessionScoped,这不是一个好习惯.

什么是正确的做法?就像我搜索一样,我变得更加困惑.

这是在GlassFish 3.1.1上,我理解其中有Weld 1.1.0.

更新:这个问题的原始形式说我无法让@ConversationScoped工作.从那以后我发现了我的错误,我确实让它像这样工作:

@Model
@ConversationScoped
public class Abean implements Serializable {

@Inject Conversation conversation;

// stuff omitted for brevity

public String getSomething() {
    if (conversation.isTransient()) conversation.begin();
    return "something";
}
Run Code Online (Sandbox Code Playgroud)

这似乎可以解决问题.但是现在我的问题已经改变了.你应该在哪里调用conversation.end()?我是否必须编写过滤器来检测用户何时离开页面?或者,如果它被单独留下,那么Abean实例何时被取消引用?

第二次更新:我在这里找到关于CDI的@ConversationScoped的非常好的讨论.

我仍然留下如何调用conversation.end()的问题.我的bean为通过AJAX更新的数据表浏览器提供有状态的支持,并且调用end()的最佳位置是用户导航离开页面.但是,如果没有编写过滤器来监控页面,我实际上并没有看到任何方法.任何关于"最佳实践"的建议都是受欢迎的.

cdi jsf-2 glassfish-3

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

尝试在构造函数中访问@Inject bean时出现NullPointerException

我有一个会话范围的bean:

@Named
@SessionScoped
public class SessionBean implements Serializable {

    private String someProperty;

    public String getSomeProperty() {
        return someProperty;
    }

}
Run Code Online (Sandbox Code Playgroud)

我想在请求范围的bean中注入它并使用它初始化:

@Named
@RequestScoped
public class RequestBean {

    @Inject
    private SessionBean sessionBean;  

    public RequestBean() {
        System.out.println(sessionBean.getProperty());
    }

}
Run Code Online (Sandbox Code Playgroud)

但是,它会引发以下异常:

java.lang.NullPointerException
    at com.example.RequestBean.<init>(RequestBean.java:42)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at org.jboss.weld.introspector.jlr.WeldConstructorImpl.newInstance(WeldConstructorImpl.java:206)
    at org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:117)
    at org.jboss.weld.bean.ManagedBean.createInstance(ManagedBean.java:336)
    at org.jboss.weld.bean.ManagedBean$ManagedBeanInjectionTarget.produce(ManagedBean.java:200)
    at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:292)
    ...
Run Code Online (Sandbox Code Playgroud)

这是怎么造成的,我该如何解决?

jsf constructor nullpointerexception cdi managed-bean

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

在自定义Shiro AuthorizingRealm中注入CDI托管bean

在我正在构建的应用程序中,我们使用Java 6 EE和JBoss(没有Spring等),使用JPA/Hibernate,JSF,CDI和EJB.

我没有找到很多好的通用安全解决方案(欢迎推荐),但我发现最好的选择是Apache Shiro.

然而,这似乎有许多缺点.其中一些你可以在Balus C的网站上阅读:

http://balusc.blogspot.com/2013/01/apache-shiro-is-it-ready-for-java-ee-6.html

但我无意中发现了它已经提到一个很大的问题在这里就依赖注入和代理.

基本上我有一个很好的基于JPA的UserDAO,它提供了身份验证所需的一切.我的数据库在persistence.xml和mydatabase-ds.xml(对于JBoss)中整齐地配置.

再次复制所有这些配置信息并将用户表查询添加到shiro.ini中似乎很愚蠢.所以这就是我选择编写自己的Realm而不是使用JdbcRealm的原因.

我的第一次尝试是继承AuthorizingRealm ...类似于:

@Stateless
public MyAppRealm extends AuthorizingRealm {
    @Inject private UserAccess userAccess;

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(
        AuthenticationToken token) throws AuthenticationException {

        UsernamePasswordToken userPassToken = (UsernamePasswordToken) token;

        User user = userAccess.getUserByEmail(userPassToken.getUsername());
        if (user == null) {
            return null;
        }

        AuthenticationInfo info = new SimpleAuthenticationInfo();
        // set data in AuthenticationInfo based on data from the user object

        return info;

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        // TODO …
Run Code Online (Sandbox Code Playgroud)

java-ee shiro cdi

12
推荐指数
2
解决办法
3617
查看次数

在Tomcat中使用CDI(Weld)和简单的POJO类

经过2天的调试和尝试,除了要求您提供解决方案之外我别无其他想法.

我想在Tomcat WebApp中使用CDI(在JEE6上),只使用简单的普通旧Java对象.据我所知,可以将POJO java类注入其他POJO Java类中吗?

这是我的示例类

  • class ToBeInjected(Application-scoped/singleton)
  • class InjectingExample
  • ServletListener"ApplicationContextListener"

应用程序作用域(单例)类"ToBeInjected":

import javax.enterprise.context.ApplicationScoped;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@ApplicationScoped
public class ToBeInjected {
  private final Logger log = LoggerFactory.getLogger(ToBeInjected.class);

  public ExampleBean() {
    log.info("ToBeInjected init");
  }

  public void sayHello() {
    log.info("Hello from ToBeInjected!");
  }

}
Run Code Online (Sandbox Code Playgroud)

类"InjectingExample"是注入上述类:

import javax.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class InjectingExample {
  private final Logger log = LoggerFactory.getLogger(InjectingExample.class);

  @Inject
  private ExampleBean bean;

  public InjectionExample() {
    log.info("InjectingExample init");
  }

  public void sayHello() {
    log.info("InjectingExample …
Run Code Online (Sandbox Code Playgroud)

tomcat java-ee cdi jboss-weld

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

在CDI焊接中查看范围

我想@ViewScoped在我的应用程序中使用- scope作为某些网页的支持bean.我还使用CDI将依赖注入到后台bean中.

但是,当我使用这样注释的支持bean时

@ManagedBean
@ViewScoped

@Inject
someDependency (...)
Run Code Online (Sandbox Code Playgroud)

@Inject注释将不注入任何东西,我得到了NullPointerException,只要我正在访问的依赖.

但是,当我装饰支持bean时

@Named
@ViewScoped


@Inject
someDependency (...)
Run Code Online (Sandbox Code Playgroud)

注射工作正常,但现在@ViewScoped被忽略,因为它不是CDI/Weld的一部分.

我如何@ViewScoped与CDI Weld一起使用?

scope cdi jboss-weld

11
推荐指数
3
解决办法
7597
查看次数

集合操作的非法语法

我在将My xhtml页面连接到托管bean时遇到问题,commandButton上的操作有效,但是当传递值时它不起作用.这是我的jsf代码:

 <h:form id="form" class="form-signin">
            <p:panel id="panel" header=" Authentification" style="" >
                <h:panelGrid columns="2" rowClasses="3">  
                    <h:outputLabel  for="login" value="Nom d'utilisateur :"  styleClass=""/>  
                    <p:inputText id="login" value=" #{authenticationBean.profil.login }" required="true" label="login" >  
                        <f:validateLength minimum="4" />  
                    </p:inputText>  
                    <h:outputLabel for="password" value="Mot de passe :" /> 
                    <p:password id="password" value=" #{authenticationBean.profil.password }" required="true" label="password" styleClass=""/> 

                    <p:row>
                        <p:commandButton id="loginButton" value="Login" ajax="false" action="#{authenticationBean.validate}" />
                        <h:messages id="messages" globalOnly="false"/>
                    </p:row> 
                </h:panelGrid>
            </p:panel> 
        </h:form>
Run Code Online (Sandbox Code Playgroud)

我正在使用morphia将数据映射到mongo db,我还有一个名为profil和一个bean的权限来管理身份验证.这是我的认证bean代码:

public class AuthenticationBean implements Serializable {
private static final long serialVersionUID = 1L;
private Profil profil;
private …
Run Code Online (Sandbox Code Playgroud)

jsf el cdi managed-bean

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

Weld和HK2之间的关系是什么?

这可能是一个愚蠢的问题,但我很困惑,我无法在任何地方找到任何明确的解释.

HK2是一个实现JS330的依赖注入框架,它是Glassfish V3和V4的基础.据我所知,泽西岛使用它

Weld是CDI的参考实现,它也是一个依赖注入框架,也可以在Glassfish中使用?

所以我的问题是这些

  • 它们是同一规格的不同实现吗?
  • 它们是不同规格的实现吗?
  • 在什么情况下我应该使用其中一个?

我理解这些问题源于我对Java EE整个生态系统的微薄理解,但我们将非常感谢任何答案

glassfish cdi weld hk2

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

如何在CDI(焊接)中注入EntityManager?

在我的项目中,我在持久层中使用JSF + JPA + CDI + WildFly 8.2.我有一个BasicDao,像这样:

 public  class BasicDao<M, K> {
    private org.jboss.logging.Logger logger = org.jboss.logging.Logger
           .getLogger("BasicDao");

    @Inject
    @Primary
    protected EntityManager em;
    Class<M> mclass;

    public EntityManager getEm() {
        return em;
    }

    public void setEm(EntityManager em) {
        this.em = em;
    }

    @Transactional(value=TxType.NOT_SUPPORTED)
    public M find(K id){ 
        return em.find(mclass, id);
    }

    @Transactional(value=TxType.REQUIRED)
    public void insert(M inst){
        this.em.persist(inst);
    }

    @SuppressWarnings("unchecked")
    @Transactional(value=TxType.REQUIRED)
    public K insertWithAutoId(M inst){
        this.em.persist(inst);
        return (K) this.em.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier(inst);
    }

    @Transactional(value=TxType.REQUIRED)
    public M update(M updated){
        return this.em.merge(updated);
    }


    @Transactional(value=TxType.REQUIRED)
    public void …
Run Code Online (Sandbox Code Playgroud)

jpa entitymanager cdi weld wildfly

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

是否可以使用CDI注入EJB实现而不是其接口?

我的配置是:Wildfly 8.2.0,Weld

是否可以在bean中注入,而不是在CDI的接口中注入?

@Stateless
class Bean implements IBean {
...
}    

interface IBean {
...
}

@SessionScoped
class Scoped {
   @Inject
   Bean bean; //Fail

   @Inject
   IBean iBean; //OK
}
Run Code Online (Sandbox Code Playgroud)

编辑:

我在上一个问题中的更多信息: 无状态EJB实现接口注入失败

java dependency-injection ejb cdi weld

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