我们正在尝试在我们的项目中评估 CDI 和 AspectJ。这里有人做过类似的事情吗?有人可以分享他们对使用 CDI 或 AspectJ 的看法,例如 1. 学习曲线 2. 不同服务器的可移植性 3. 可维护性 4. 调试
谢谢
我正在阅读Java EE 7教程.在第13.12章中,有一个示例应用程序,ajaxguessnumber.我在Glassfish 4中运行示例,一切正常.然后我将System.out.println放在bean构造函数中,我意识到构造函数在初始页面加载期间被调用了两次.为什么会这样,即使是@SessionScoped bean?
这是xhtml文件
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<h:outputStylesheet library="css" name="default.css"/>
<title>Ajax Guess Number Facelets Application</title>
</h:head>
<h:body>
<h:form id="AjaxGuess">
<h:graphicImage value="#{resource['images:wave.med.gif']}"
alt="Duke waving his hand"/>
<h2>
Hi, my name is Duke. I am thinking of a number from
#{dukesNumberBean.minimum} to #{dukesNumberBean.maximum}.
Can you guess it?
</h2>
<p>
<h:inputText
id="userNo"
title="Type a number from 0 to 10:"
value="#{userNumberBean.userNumber}">
<f:validateLongRange
minimum="#{dukesNumberBean.minimum}"
maximum="#{dukesNumberBean.maximum}"/>
</h:inputText>
<h:commandButton id="submit" value="Submit" >
<f:ajax execute="userNo" …Run Code Online (Sandbox Code Playgroud) 我有实施类似例如登录接口故障的简单与JSF 2.1 CRUD Web应用程序,PrimeFaces 3.5,EJB 3.1,JPA(ORM)/ EclipseLink的,JAAS中,MySQL 在TomEE的邮件列表,我被告知,我LoginController.java我正在尝试注入 Logger,但 Logger 注入不受 CDI 管理。有人告诉我改用生产者。不知道它是什么,我在互联网上搜索并找到了这个示例 但是我仍然不满意它,所以请解释我必须修改什么才能为记录器实现生产者。
登录控制器.java
package controller;
import util.DateUtility;
import java.io.IOException;
import java.io.Serializable;
import java.security.Principal;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/**
* Login Controller class allows only authenticated users to log in to the web
* application.
*
* @author Emre Simtay <emre@simtay.com>
*/
@Named
@SessionScoped
public class LoginController implements Serializable …Run Code Online (Sandbox Code Playgroud) 简单的问题,但我无法解决它.据我所知,首先初始化字段,然后调用构造函数.
以下代码
public class Controller {
@Inject
private ReadCommand readCommand;
public Controller() {
if (readCommand==null){
System.out.println("NO");
}else{
System.out.println("YES");
}
}
}
Run Code Online (Sandbox Code Playgroud)
打印NO.但是当我注入构造函数时
@Inject
public Controller(ReadCommand readCommand)
Run Code Online (Sandbox Code Playgroud)
它打印YES.我究竟做错了什么?
是否可以在java中为静态方法注入局部变量,例如
@Inject
public void someMethod()
{
@MyInjectQualifier MyObjectClass myobject;
// use myobject here
}
Run Code Online (Sandbox Code Playgroud) 我们的应用程序包含与支持bean和无状态EJB服务交互的Web页面,但也有一个与无状态EJB服务交互的远程客户端.
许多服务查询数据库,然后根据当前用户/调用者过滤结果集(例如,用户只能查看某些记录类型); 也就是说,他们使用程序化而非声明性安全性.
在网络方面,我的直觉是将当前登录的用户存储在SessionBean中,但我希望无状态EJB服务根据当前登录的用户过滤结果集,以便过滤也适用于远程客户端调用.我可以将SessionBean注入无状态EJB服务,但我认为SessionBeans使用HTTP会话,并且因为在远程客户端调用期间没有HTTP会话,所以我看不出它是如何工作的.
我觉得我的方法是错误的,我应该从容器中检索"Principal"; 但是,由于我们的应用程序的开发生命周期,容器管理的安全性尚未设置,但我仍然负责实现负责过滤记录的业务逻辑,而不是以后.
我密切相关的问题:
ps我是Java EE的新手.
技术:
javax.enterprise.context.SessionScopedjavax.ejb.Stateless更新:
有关"远程客户端"的更多详细信息.我不确定如何说这个,因为我是Java EE的新手,但这个"远程客户端"不会通过HTTP.另一个应用程序,我们称之为应用程序X,将从客户端接收XML消息.我认为他们使用证书对客户端进行身份验证.应用程序X将XML转换为POJO并直接调用我的无状态EJB服务.
在这种情况下,我认为我说我不应该SessionBean向StatelessEJB服务注入,因为在应用程序X调用EJB服务时将不会有HTTP会话.我的理解是否正确?
感谢您的耐心等待.我知道我对这些事情的无知.
这是我手动获取 cdi bean 实例的方式:
Bean<?> bean = (Bean<?>)beanManager.resolve(beanManager.getBeans(Foo.class));
Foo foo=(Foo) beanManager.getReference(bean, bean.getBeanClass(), beanManager.createCreationalContext(bean));
Run Code Online (Sandbox Code Playgroud)
如果我这样声明 Foo 类:
@Dependent
public class Foo{
...
}
Run Code Online (Sandbox Code Playgroud)
一切正常。但是,如果我这样声明 Foo 类
@Dependent
public class Foo<T>{
...
}
Run Code Online (Sandbox Code Playgroud)
cdi 容器无法创建 cdi bean。如何手动获取使用泛型(Foo)声明的类的 cdi bean?
当使用 CDI 注入 bean 时:
@Inject Person person;
Run Code Online (Sandbox Code Playgroud)
是否需要/推荐使用 setter 和 getter?
import javax.inject.Inject;
import javax.inject.Named;
@Named
@SessionScoped
public class myJSFBean{
@Inject Person person;
public void setPerson (Person person){
this.person = person;
}
public Person getPerson (){
return person;
}
Run Code Online (Sandbox Code Playgroud)
我找到了这个文档,但我不明白它的意思:http : //docs.oracle.com/javaee/6/tutorial/doc/gjbbp.html
说在下面的代码中,Hazelcast 实例将是应用程序范围是真的吗?
@ApplicationScoped
public class Producer {
private HazelcastInstance instance;
@PostConstruct
public void afterCreate() {
instance = Hazelcast.newHazelcastInstance();
}
@Produces
public HazelcastInstance getInstance() {
return instance;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑
这个解决方案:
@ApplicationScoped
public class Producer {
private HazelcastInstance instance;
private Producer() {}
@PostConstruct
public void afterCreate() {
instance = Hazelcast.newHazelcastInstance();
}
@PreDestroy
public void beforeDestroy() {
if(instance != null) {
instance.shutdown();
}
}
@Produces
@ApplicationScoped
public HazelcastInstance getInstance() {
return instance;
}
}
Run Code Online (Sandbox Code Playgroud) 如果我创建一个带注释的bean,@RequestScoped我希望它会为每个新请求实例化一个新的代理实例.
另一方面,每个请求都与其自己的线程相关联.
我的问题是:如果新请求重用以前从池中创建的线程,CDI会重用以前创建的bean/service的代理对象吗?
cdi ×10
java ×7
inject ×2
jakarta-ee ×2
java-ee ×2
jsf ×2
aop ×1
apache-tomee ×1
architecture ×1
ejb ×1
generics ×1
glassfish ×1
glassfish-4 ×1
hazelcast ×1
jaas ×1
java-ee-7 ×1
proxies ×1
threadpool ×1