我正在尝试将CDI用于我的JSF/Java EE应用程序.我有以下类层次结构:
/**
* base controller class
* also contains some final methods and an inner enum class declaration
*/
public abstract class AbstractCrudController<K, E> implements Serializable {
private Class<E> entityClass;
public AbstractCrudController(Class<E> entityClass) {
this.entityClass = entityClass;
}
// ...
}
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
@Named
@SessionScoped
public class CategoryController extends AbstractCrudController<Long, Category> implements Serializable {
public CategoryController() {
super(Category.class);
}
//...
}
Run Code Online (Sandbox Code Playgroud)
当我尝试在GF 3.1上部署应用程序时,我得到以下CDI/Weld异常:
严重:加载应用程序时出现异常:WELD-001435正常范围的bean类com.web.AbstractCrudController不可代理,因为它没有no-args构造函数.org.jboss.weld.exceptions.UnproxyableResolutionException:WELD-001435正常范围的bean类com.web.AbstractCrudController不可代理,因为它没有no-args构造函数.在org.jboss.weld.util.Proxies.getUnproxyableClassException(Proxies.java:215)在org.jboss.weld.util.Proxies.getUnproxyableTypeException(Proxies.java:166)在org.jboss.weld.util.Proxies.getUnproxyableTypesException (Proxies.java:191)位于org.jboss的org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:134)org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:148). weld.bootstrap.Validator.
即使我向基类添加了一个no-args构造函数,Weld仍然会抱怨该类不可代理,因为它有最终方法.为什么WELD强迫我改变我的班级设计?使用JSF @ManagedBean批注一切正常.
我将不胜感激任何帮助.谢谢,西奥
我有一个@RequestScoped CDI bean,我想把它变成一个EJB来获取声明式事务.(我在EJB 3.1,Java EE 6上)
目前,我在子例程之间传递状态,假设实例仅用于单个请求.如果我@Stateless现在补充说假设会改变.
例如,我想做类似的事情
@Stateless
@Named
@RequestScoped
public class Foo {
private String var1; // can't use instance vars in @Stateless?
private String var2;
public void transactionForRequest() {
var1 = value;
var2 = value;
....
subroutine();
}
}
Run Code Online (Sandbox Code Playgroud)
我认为以上不起作用 - 这是正确的吗?
我正在考虑两种选择:
EJBContext.getContextDatamap替换实例变量.哪个更好?还有其他一些我没想到的选择吗?(除了等待Java EE 7或切换到Spring.:-))
我想将一个object(ReportBean)持久化到数据库,但是我收到了错误消息:
javax.persistence.TransactionRequiredException: Transaction is required to perform this operation (either use a transaction or extended persistence context)
Run Code Online (Sandbox Code Playgroud)
这是一些代码:
实体
@Entity
@Table(name="t_report")
@Access(AccessType.FIELD)
public class ReportBean implements Serializable {
// fields (@Column, etc.)
// setters/getters methods
// toString , hashCode, equals methods
}
Run Code Online (Sandbox Code Playgroud)
允许EntityManager注入的自定义注释(带@Inject)
import javax.inject.Qualifier;
import static java.lang.annotation.ElementType.*;
import java.lang.annotation.Target;
@Qualifier
@Target({TYPE, METHOD, FIELD, PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyEm {
}
Run Code Online (Sandbox Code Playgroud)
EntityManager提供程序
import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;
public class EntityManagerProvider { …Run Code Online (Sandbox Code Playgroud) 是否可以在CDI事件中使用类型差异?这是案例:
MyEvent和子类DummyEventList<? extends MyEvent>,其中包含DummyEvent实例我怎样才能做到这一点?
如果我遍历调用fire()每个事件的集合,它将调用@Observes MyEvent evt但不调用@Observes DummyEvent evt方法.
**更新**
创建示例代码以阐明问题:
https://github.com/jfaerman/jfaerman/blob/master/test-cdi/src/main/java/jfaerman/App.java
我希望事件被激发两次,一次单独一次,一次从列表中.
I really need your help. I'm working on this problem for weeks or months now. I apologize for the long post, but I want to explain the problem and my settings as precisely as possible.
My JAVA EE 6 web application mainly contains 3 Servlets: a javax.faces.webapp.FacesServlet, a StreamingServlet extending javax.servlet.http.HttpServlet and a ClientServlet extending org.eclipse.jetty.websocket.WebSocketServlet. I want to use CDI with these Servlets but it only works for the FacesServlet, to be more precisely, for the Beans …
CDI类BeanManager有几种采用类型Annotation或参数的方法Annotation....例如BeanManager.getBeans(...).
我想知道我应该如何将我的注释作为参数传递给那些方法.
我试过了BeanManager.getBeans(MyBean.class, MyAnnotation.class),但是不行.我见过Class.isAnnotation(),但没有什么比Class.asAnnotation()把它作为一种Annotation类型来检索它了.
既没有BeanManager.getBeans(MyBean.class, @MyAnnotation)工作,也没有工作BeanManager.getBeans(MyBean.class, (Annotation) MyAnnotation.class).
如何将我的注释类检索为类型Annotation?
我正在为JavaEE7中的学习CDI设置基本环境.我有以下代码用于启动Weld.只是一个启动和关闭.
package com.anshbansal;
import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;
public class Main {
public static void main(String[] args) {
Weld weld = new Weld();
WeldContainer container = weld.initialize();
weld.shutdown();
}
}
Run Code Online (Sandbox Code Playgroud)
我正在控制台上关注.
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/D:/Softs/Programming/Java/Java%20JARs/JBoss%20Weld-2.0.3/jar/weld-se.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/D:/Softs/Programming/Java/Java%20JARs/JBoss%20Weld-2.0.3/jar/weld-servlet.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.SimpleLoggerFactory]
[main] INFO org.jboss.weld.Version - WELD-000900 2.0.3 (Final)
[main] INFO org.jboss.weld.Bootstrap - WELD-000101 Transactional services not available. Injection of …Run Code Online (Sandbox Code Playgroud) 我有以下CDI托管bean:
@Named
@SessionScoped
public class InfoPageController implements Serializable {
@Inject
private InfoPageMapper mapper;
}
Run Code Online (Sandbox Code Playgroud)
它在部署到GlassFish 4.1期间抛出以下异常:
Exception while loading the app : CDI deployment failure:WELD-001413: The bean Managed Bean [class de.triaconsulting.cashyourgame.fe.controller.InfoPageController] with qualifiers [@Default @Any @Named] declares a passivating scope but has a non-passivation-capable dependency Managed Bean [class de.triaconsulting.cashyourgame.fe.mapper.InfoPageMapper] with qualifiers [@Any @Default]
org.jboss.weld.exceptions.UnserializableDependencyException: WELD-001413: The bean Managed Bean [class de.triaconsulting.cashyourgame.fe.controller.InfoPageController] with qualifiers [@Default @Any @Named] declares a passivating scope but has a non-passivation-capable dependency Managed Bean [class de.triaconsulting.cashyourgame.fe.mapper.InfoPageMapper] with …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用JSF和Weld CDI配置Jetty.按照本手册后,我偶然发现了以下堆栈跟踪:
Caused by: java.lang.IllegalStateException: Singleton not set for STATIC_INSTANCE => []
at org.jboss.weld.bootstrap.api.helpers.RegistrySingletonProvider$RegistrySingleton.get(RegistrySingletonProvider.java:28)
at org.jboss.weld.Container.instance(Container.java:55)
at org.jboss.weld.SimpleCDI.<init>(SimpleCDI.java:77)
at org.jboss.weld.environment.WeldProvider$EnvironmentCDI.<init>(WeldProvider.java:45)
at org.jboss.weld.environment.WeldProvider.getCDI(WeldProvider.java:61)
at javax.enterprise.inject.spi.CDI.current(CDI.java:60)
at org.jboss.weld.servlet.WeldInitialListener.contextInitialized(WeldInitialListener.java:94)
at org.jboss.weld.servlet.api.helpers.ForwardingServletListener.contextInitialized(ForwardingServletListener.java:34)
at org.jboss.weld.environment.servlet.EnhancedListener.onStartup(EnhancedListener.java:65)
at org.eclipse.jetty.plus.annotation.ContainerInitializer.callStartup(ContainerInitializer.java:140)
at org.eclipse.jetty.annotations.ServletContainerInitializersStarter.doStart(ServletContainerInitializersStarter.java:63)
... 50 more
Run Code Online (Sandbox Code Playgroud)
有人看到这里出了什么问题吗?
我已经阅读并开始意识到实体(数据对象 - 用于JPA或序列化)注入其中是一个坏主意.这是我目前的设计(所有适当的字段都有getter和setter,serialVersionUID为简洁起见我放弃了).
这是父对象,它是实体组合图的头部.这是我序列化的对象.
public class State implements Serializable {
List<AbstractCar> cars = new ArrayList<>();
List<AbstractPlane> planes = new ArrayList<>();
// other objects similar to AbstractPlane as shown below
}
Run Code Online (Sandbox Code Playgroud)
AbstractPlane 它的子类只是没有注入的简单类:
public abstract class AbstractPlane implements Serializable {
long serialNumber;
}
public class PropellorPlane extends AbstractPlane {
int propellors;
}
public class EnginePlane extends AbstractPlane {
List<Engine> engines = new ArrayList<>(); // Engine is another pojo
}
// etc.
Run Code Online (Sandbox Code Playgroud)
相比之下,每种具体类型的汽车都需要一个拥有某些行为的经理以及一些特定形式的数据:
public abstract class AbstractCar implements Serializable { …Run Code Online (Sandbox Code Playgroud) cdi ×10
java-ee ×5
java ×3
jboss-weld ×3
java-ee-6 ×2
jetty ×2
weld ×2
annotations ×1
bean-manager ×1
ejb ×1
ejb-3.1 ×1
events ×1
jsf ×1
jsf-2 ×1
managed-bean ×1
parameters ×1
servlets ×1
transactions ×1