标签: cdi

从Seam 2切换到普通JavaEE 6的最大变化(损失)可能是什么?

问题几乎说明了一切,但显然我正在寻找在Java EE 6环境中可能会错过Seam 2的事情("损失").

对于我的最新(小)项目JavaEE 6或更具体的JSF 2是修复要求,因此使用Seam 2不是一个选项(也不会是).尽管有些人说要让Seam 2使用JSF 2,但我从未做过.到目前为止,我只使用了Seam 2,我担心切换到普通的JavaEE环境会带来比我目前所知更多的问题.

该项目具有以下基本/核心要求:

  • 基于角色和权限的安全概念(约50个用户)
  • JPA 2事务持久性
  • ...

其余的将是基于GUI,搜索表单,客户端验证等,将由RichFaces 4和JavaEE 6 bean验证处理.没有Web服务,没有宁静的URL,没有消息,没有电子邮件.

我可以看到使用Seam安全性肯定是一种损失,但我不确定Seam持久性,实体/查询框架,JBoss EL和其他将是什么,尤其是整体编程模型(导航,EL,bean) .请注意,我们将能够在有意义的时候添加Seam 3模块,因此您可以在"增益"部分的讨论中包含Seam 3.

那么,任何人都能清楚这一点吗?(它不一定是一个完整的总结,无论你想到什么,继续)

PS:我无法连接到Seam论坛所以我觉得我需要在这里问.

seam cdi seam2 seam3 java-ee-6

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

找不到命名对象

我创建了一个新的验证器:

package com.example.jsf.validator;

import com.example.components.LoginFormValue;
import com.example.ejb.SecurityEjb;
import java.io.Serializable;
import javax.ejb.EJB;
import javax.enterprise.context.ApplicationScoped;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
import javax.inject.Named;

/**
 * Validator for {@code login-form} component.
 *
 * @author steve
 */
@Named
@ApplicationScoped
public class LoginValidator implements Validator, Serializable
{
    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException
    {
        if (value == null)
        {
            return;
        }

        LoginFormValue loginFormValue = (LoginFormValue) value;
        if (securityEjb.checkCredentials(loginFormValue.getEmailAddress(), loginFormValue.getPassword())) {
            return;
        }

        throw new ValidatorException(new FacesMessage("Incorrect …
Run Code Online (Sandbox Code Playgroud)

java jsf cdi jsf-2

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

如何在JUnit测试中引导焊接se

我有一个maven项目进行单元测试,并希望使用CDI.我把焊接se依赖放在pom.xml中,如下所示:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.10</version>
</dependency>
<dependency>
    <groupId>org.jboss.weld.se</groupId>
    <artifactId>weld-se</artifactId>
    <version>1.1.8.Final</version>
</dependency>
<dependency>
    <groupId>javax.enterprise</groupId>
    <artifactId>cdi-api</artifactId>
    <version>1.0-SP3</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

我在JUnit测试运行器中启动焊接:

public class WeldJUnit4Runner extends BlockJUnit4ClassRunner {
   private final Class klass;
   private final Weld weld;
   private final WeldContainer container;

   public WeldJUnit4Runner(final Class klass) throws InitializationError {
       super(klass);
       this.klass = klass;
       this.weld = new Weld();
       this.container = weld.initialize();
   }

   @Override
   protected Object createTest() throws Exception {
       final Object test = container.instance().select(klass).get();

       return test;
   }
}
Run Code Online (Sandbox Code Playgroud)

以及使用此跑步者的单元测试.测试是注入一个应用程序范围的bean.问题是焊接不能初始化,因为对唯一的注入点有"不满意的依赖",好像我的应用程序作用域bean完全不知道焊接.但是那个bean在我的测试中是在src/test/java/...中(但是在另一个java包中).

我在src/test/resources中有一个空的beans.xml.

我注意到焊接在启动时会发出警告,但我不认为这些是我的问题的原因:

604 [main] WARN org.jboss.weld.interceptor.util.InterceptionTypeRegistry - Class 'javax.ejb.PostActivate' …
Run Code Online (Sandbox Code Playgroud)

java junit cdi weld

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

自定义验证程序类不起作用

我在这里有一个问题:

场景: 我有一个JSF-2,Spring(Beans wiring)应用程序.我写了一个自定义验证器,我想执行它.

@FacesValidator("com.test.vali")
@Named("com.test.vali")
public class TestValidator implements Validator {

    @Override
    public void validate(FacesContext arg0, UIComponent arg1, Object arg2) throws ValidatorException {
        System.out.println("dhkdfkbhdfbkdfksdfdfk");

    }

}
Run Code Online (Sandbox Code Playgroud)

我试图使用以下方式注入验证器:

方法1:

  <h:inputText value="#{helloWorld.name}">
      <f:validator binding="#{com.test.vali}" />
  </h:inputText>
Run Code Online (Sandbox Code Playgroud)

产量

当试图渲染页面时,它抛出异常.

javax.servlet.ServletException: /testRichFaces.xhtml @17,48 <f:validator> A validator id was not specified. Typically the validator id is set in the constructor ValidateHandler(ValidatorConfig)
Run Code Online (Sandbox Code Playgroud)

在此搜索了很多,并验证了几种方式:

  1. Java文件在一个包中.

路#2

 <f:validator validatorId="com.test.vali" />
Run Code Online (Sandbox Code Playgroud)

产量

javax.servlet.ServletException: Expression Error: Named Object: com.test.vali not found.
Run Code Online (Sandbox Code Playgroud)

所以从方式#1和方式#2,我可以解释没有任何注释对我有用.

然后,我试图转到最后一种方法:

方式#3:在faces-config.xml中添加验证器,只是为了表明我使用2.0兼容性:

<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" …
Run Code Online (Sandbox Code Playgroud)

java cdi jsf-2

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

在CDI实现项目中包含空beans.xml的目的是什么?

我正在使用weld,CDI的RI作为我的JSF-EJB-JPA Web应用程序中的依赖注入组件.我在我的项目看,我们有空的beans.xml在 META-INF/beans.xmlejb.jarWEB-INF/beans.xml在我的抗战.我不明白为什么我们需要beans.xml在那个文件中没有定义时保持空?

java cdi jsf-2 ejb-3.1 jboss-weld

4
推荐指数
2
解决办法
2279
查看次数

无法在EL/Facelet中找到具有默认名称的@Named CDI bean

jee6教程中,我可以阅读以下内容:

@Named限定符允许您使用bean名称访问bean,第一个字母为小写.例如,Facelets页面将bean称为打印机.

您可以指定@Named限定符的参数以使用非默认名称:

但是,当我尝试使用@Named而不添加参数时,找不到我的bean,我得到如下的异常.

@Named
@ViewScoped
public class MTestBean {
...
}
Run Code Online (Sandbox Code Playgroud)

例外;

javax.servlet.ServletException: /MyPage.xhtml @15,65 listener="#{mTestBean.init}": Target Unreachable, identifier 'mTestBean' resolved to null
Run Code Online (Sandbox Code Playgroud)

但如果我使用

@Named("mTestBean")
Run Code Online (Sandbox Code Playgroud)

一切正常.这是预期的行为吗?有没有办法我可以列出EL中可用的bean,也许我假设错误的默认名称?

el cdi jsf-2

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

CDI/Weld无法对RESTEasy资源进行构造函数注入

我正在尝试将RESTEasy与Weld结合在AppEngine上,但是在构造函数注入方面遇到了麻烦.

我添加了RESTEasy CdiInjectorFactory上下文参数和Weld servlet侦听器.

我的RESTEasy应用程序类看起来像:

public class MyApplication extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        HashSet<Class<?>> classes = new HashSet<Class<?>>();
        classes.add(CustomerResource.class);
        return classes;
    }
}
Run Code Online (Sandbox Code Playgroud)

和CustomerResource:

@Path("/rest/app/customers")
public class CustomerResource {

    private final CustomerService customerService;

    @Inject
    public CustomerResource(CustomerService customerService) {
        this.customerService = customerService;
    }

    ..
}
Run Code Online (Sandbox Code Playgroud)

CustomerService是一项简单的服务,例如:

public class CustomerService {

    public List<Customer> getCustomers() {
        ..
    }
}
Run Code Online (Sandbox Code Playgroud)

当我启动服务器时,我在日志中看到:

[INFO] 2014-01-30 21:34:53 INFO  org.jboss.weld.Version:146 - WELD-000900: 2.1.2 (Final)
[INFO] 2014-01-30 21:34:53 WARN  org.jboss.weld.environment.servlet.Listener:137 - @Resource injection not available in …
Run Code Online (Sandbox Code Playgroud)

google-app-engine resteasy cdi jboss-weld weld

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

Java CDI:拦截器有范围吗?

CDI中拦截器的范围是什么?

又,这是合法的吗?我会在每个被调用的地方获得相同的拦截器实例吗?

@RequestScoped
public class SalesForceControllerInterceptor {
    @Inject
    private Logger log;

    @AroundInvoke
    public Object intercept(InvocationContext context) throws Exception {
...
    }
Run Code Online (Sandbox Code Playgroud)

java guice java-ee cdi weld

4
推荐指数
2
解决办法
1910
查看次数

拦截CDI bean中的私有方法

我有一个带有私有方法的CDI bean.我写了一个拦截器如下:

拦截器的代码:

@Interceptor
@TimeMeasure
public class TimeWatcher implements Serializable {

    @AroundInvoke
    public Object logMethodEntry(InvocationContext ctx) throws Exception {

        long t0 = System.nanoTime();
        try {
            return ctx.proceed();
        } finally {
            long dt = System.nanoTime() - t0;
            System.out.println("Method execution time: " + ctx.getMethod().getName() +  " - " + dt);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注释的代码:

 import static java.lang.annotation.ElementType.METHOD;
    import static java.lang.annotation.ElementType.TYPE;
    import static java.lang.annotation.RetentionPolicy.RUNTIME;


    @InterceptorBinding
    @Target({TYPE, METHOD})
    @Retention(RUNTIME)
    public @interface TimeMeasure {

    }
Run Code Online (Sandbox Code Playgroud)

一切只适用于外部调用的公共方法,如果我从CDI bean中调用方法它不起作用.我使用JSF 2.0 MyFaces和Omnifaces来完成@ViewScoped

先感谢您.

jsf interceptor cdi

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

运行时动态CDI注入

这个问题来自我一年前写的博客文章

尽管我为DAO使用了自定义CDI限定词,但我想知道是否存在一种动态注入DAO的方法。

我问的原因如下。目前,我有3个CDI限定符@HibernateDAO(对于Hibernate Session注入类型DAO),@JPADAO(对于JPA特定的DAO)和@JDBCDAO(对于纯JDBCDAO)。这就要求我必须像这样在每个具体实现上以及在注入时都指定它。

@Inject @JPADAO
private CustomerDAO customerDAO;
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法可以使我添加各种DAO,而无需更改代码,编译和部署?

我想在我的项目的下一个版本中介绍MongoDB,我在想是否可以放弃@MongoDBDAO和注入,

@Inject @MongoDBDAO
private CustomerDAO customerDAO;
Run Code Online (Sandbox Code Playgroud)

我知道CDI注入可以允许默认注入和替代注入。我希望其他开发人员可以将默认实现与另一个子类一起使用,并能够在不更改现有服务代码的情况下注入它。

这种效果:

@Inject @DAO
private CustomerDAO customerDAO;
Run Code Online (Sandbox Code Playgroud)

哪里@DAO可以有任何风格的DAO(甚至来自第三方),并且以某种方式映射@DAO以首先找到替代方法(如果找不到),则使用默认实现。

谢谢。

哦! 该解决方案必须严格使用最新的(作为撰写本文的时间)Java EE CDI规范。使用的技术:

  • RedHat JBoss Wildfly 8.2.0 Final(完全符合Java EE 7)。
  • Java 8。
  • Java EE 7 API。

我不会拒绝使用Spring Framework的解决方案,因为它可以帮助其他Spring开发人员。

java dependency-injection java-ee cdi

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