问题几乎说明了一切,但显然我正在寻找在Java EE 6环境中可能会错过Seam 2的事情("损失").
对于我的最新(小)项目JavaEE 6或更具体的JSF 2是修复要求,因此使用Seam 2不是一个选项(也不会是).尽管有些人说要让Seam 2使用JSF 2,但我从未做过.到目前为止,我只使用了Seam 2,我担心切换到普通的JavaEE环境会带来比我目前所知更多的问题.
该项目具有以下基本/核心要求:
其余的将是基于GUI,搜索表单,客户端验证等,将由RichFaces 4和JavaEE 6 bean验证处理.没有Web服务,没有宁静的URL,没有消息,没有电子邮件.
我可以看到使用Seam安全性肯定是一种损失,但我不确定Seam持久性,实体/查询框架,JBoss EL和其他将是什么,尤其是整体编程模型(导航,EL,bean) .请注意,我们将能够在有意义的时候添加Seam 3模块,因此您可以在"增益"部分的讨论中包含Seam 3.
那么,任何人都能清楚这一点吗?(它不一定是一个完整的总结,无论你想到什么,继续)
PS:我无法连接到Seam论坛所以我觉得我需要在这里问.
我创建了一个新的验证器:
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) 我有一个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) 我在这里有一个问题:
场景: 我有一个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)
在此搜索了很多,并验证了几种方式:
路#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) 我正在使用weld,CDI的RI作为我的JSF-EJB-JPA Web应用程序中的依赖注入组件.我在我的项目看,我们有空的beans.xml在 META-INF/beans.xml中ejb.jar和WEB-INF/beans.xml在我的抗战.我不明白为什么我们需要beans.xml在那个文件中没有定义时保持空?
在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,也许我假设错误的默认名称?
我正在尝试将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) CDI中拦截器的范围是什么?
又,这是合法的吗?我会在每个被调用的地方获得相同的拦截器实例吗?
@RequestScoped
public class SalesForceControllerInterceptor {
@Inject
private Logger log;
@AroundInvoke
public Object intercept(InvocationContext context) throws Exception {
...
}
Run Code Online (Sandbox Code Playgroud) 我有一个带有私有方法的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
先感谢您.
这个问题来自我一年前写的博客文章。
尽管我为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规范。使用的技术:
我不会拒绝使用Spring Framework的解决方案,因为它可以帮助其他Spring开发人员。