我对@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使用...
谢谢 !
使用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)
你遇到过这种行为吗?有什么想让这个工作好吗?
我正在尝试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) Java EE 6 CDI事件是事务性的吗?
如果我在事务中触发事件,然后回滚事务,那么事件侦听器的效果是否也会回滚?
此行为是否依赖于支持事务的事件侦听器本身?
如果我尝试从事件监听器内部回滚异常,那么它是否回滚触发事件的事务?
我刚刚切换到Weld来使用CDI JSF 2 Beans +会话范围.
这是我的maven依赖:
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet</artifactId>
<version>1.0.1-Final</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
这是我的web.xml中的条目:
<listener>
<listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)
我立即注意到的一件事是我只需要重新加载我的tomcat 7 2次,java.lang.OutOfMemoryError: PermGen space并将显示在catalina.out日志文件中.
在使用Weld之前,我可以在不使用java.lang.OutOfMemoryError的情况下安全地重新加载我的tomcat 7超过10次.我认为在catalina.sh中增加我的Xmx选项会有所帮助,但这并不符合我的经验.JAVA_OPTS=-Xmx1024m
这是正常的吗?
在学习JSR-299之后,我阅读了Weld参考文献的第5.1节,其中解释了范围在CDI中的工作原理.显然,语境是与范围密切相关的概念.我已经理解了每一个是什么,但在我的脑海里并没有非常清楚地分开,我甚至想要交替使用这些词.
范围和背景有什么区别?这两个概念之间有什么关系?
我希望CDI领域有一个答案,但我对一般的Java有疑问,因为这些概念也用于其他环境.实际上,在CDI,Java 和一般情况下解释概念的答案会得到更多的积分 - 如果我能给他们的话.
我想创建一个Spring的bean生成器方法,它知道是谁调用了它,所以我开始使用以下代码:
@Configuration
public class LoggerProvider {
@Bean
@Scope("prototype")
public Logger produceLogger() {
// get known WHAT bean/component invoked this producer
Class<?> clazz = ...
return LoggerFactory.getLogger(clazz);
}
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能得到这些信息谁想要得到这个bean注入?
我正在寻找一些在Spring世界中相当于CDI的东西InjectionPoint.
我试图在一个按照单例方法实现的类中注入一个logger对象.
代码几乎看起来像这样:
Logger 类:
public class LoggerFactory {
@Produces
public Logger getLogger(InjectionPoint caller){
return Logger.getLogger(caller.getMember().getDeclaringClass().getName());
}
}
Run Code Online (Sandbox Code Playgroud)
然后我创建一个需要logger并实现Singleton模式的类:
public class MySingleton{
@Inject
private Logger logger;
private MySingleton instance;
/*
* Private constructor for singleton implementation
*/
private MySingleton(){
logger.info("Creating one and only one instance here!");
}
public MySingleton getInstance(){
if(instance == null) {
instance = new MySingleton();
}
return instance;
}
Run Code Online (Sandbox Code Playgroud)
}
如果我运行代码(在Glassfish 3.1.2.2上),我会在尝试使用记录器时立即获得NPE.我做错了什么(beans.xml档案到位)?我也尝试使用@Injectsetter方法为Logger对象,但没有运气.
我正在尝试从我的wildfly配置文件夹中的属性文件中读取部署特定信息.我试过这个:
@Singleton
@Startup
public class DeploymentConfiguration {
protected Properties props;
@PostConstruct
public void readConfig() {
props = new Properties();
try {
props.load(getClass().getClassLoader().getResourceAsStream("my.properties"));
} catch (IOException e) {
// ... whatever
}
}
Run Code Online (Sandbox Code Playgroud)
但显然这不起作用,因为配置文件夹不再在类路径中.现在我找不到一个简单的方法来做到这一点.我最喜欢的是这样的:
@InjectProperties("my.properties")
protected Properties props;
Run Code Online (Sandbox Code Playgroud)
到目前为止,我在网上找到的唯一解决方案是制作我自己的OSGi模块,但我相信必须有一种更简单的方法(没有OSGi!).谁能告诉我怎么样?
在我的Java EE项目中,我有一些抽象类.IntelliJ IDEA强调它们是红色并告诉我:
托管bean必须是具体类,或者使用@Decorator注释
如果顶级Java类被任何其他Java EE规范定义为托管bean,或者满足以下所有条件,则它是托管bean:
- 它不是一个非静态的内部类.
- 它是一个具体的类,或者注释为@Decorator.
- 它没有使用EJB组件定义注释或在ejb-jar.xml中声明为EJB bean类.
- 它有一个合适的构造函数 - 或者:
- 该类有一个没有参数的构造函数,或者
- 该类声明一个注释为@Inject的构造函数.
我只想使用抽象类,没有任何注释.虽然IntelliJ告诉我这是一个错误,但我的JBoss服务器并没有抱怨它.
任何解释?