Jsf 2 使用CDI而不是@ManagedBean:UnproxiableResolutionException,因为超类没有参数构造函数
我正在尝试将CDI用于我的JSF/JavaEE应用程序。我有以下类层次结构:Jsf 2 使用CDI而不是@ManagedBean:UnproxiableResolutionException,因为超类没有参数构造函数,jsf-2,cdi,jboss-weld,Jsf 2,Cdi,Jboss Weld,我正在尝试将CDI用于我的JSF/JavaEE应用程序。我有以下类层次结构: /** * 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>
/**
* 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);
}
//...
}
/**
*基本控制器类
*还包含一些final方法和内部枚举类声明
*/
公共抽象类AbstractCrudController实现可序列化{
私有类实体类;
公共抽象CrudController(类entityClass){
this.entityClass=entityClass;
}
// ...
}
导入javax.enterprise.context.SessionScoped;
导入javax.inject.Named;
@命名
@会议范围
公共类CategoryController扩展AbstractCrudController实现可序列化{
公共类别控制器(){
超级(类别、类别);
}
//...
}
当我尝试在GF 3.1上部署应用程序时,我得到以下CDI/Weld异常:
严重:加载时发生异常
app:WELD-001435正常范围bean
班
com.web.AbstractCrudController
不可代理,因为它没有
没有参数构造函数。
org.jboss.weld.exceptions.Unproxy解决方案异常:
WELD-001435正常范围的bean类
com.web.AbstractCrudController
不可代理,因为它没有
没有参数构造函数。
位于org.jboss.weld.util.Proxies.GetUnproxiableClassException(Proxies.java:215)
位于org.jboss.weld.util.Proxies.GetUnproxiableTypeException(Proxies.java:166)
位于org.jboss.weld.util.Proxies.GetUnproxiableTypesException(Proxies.java:191)
位于org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:134)
位于org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:148)
位于org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:363)
位于org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:349)
位于org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:416)
位于org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:178)
位于org.glassfish.kernel.event.eventsiml.send(eventsiml.java:128)
位于org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:265)
位于com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:402)
位于com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:221)
位于org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:351)
位于com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:360)
位于com.sun.enterprise.v3.admin.CommandRunnerImpl.docomand(CommandRunnerImpl.java:375)
位于com.sun.enterprise.v3.admin.CommandRunnerImpl.docomand(CommandRunnerImpl.java:1072)
在com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:101)
位于com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1221)
位于com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1210)
位于com.sun.enterprise.v3.admin.AdminAdapter.docomand(adminapter.java:375)
在com.sun.enterprise.v3.admin.adminapter.service(adminapter.java:209)上
位于com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:166)
位于com.sun.enterprise.v3.server.HK2Dispatcher.dispatcher(HK2Dispatcher.java:117)
位于com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:234)
位于com.sun.grizzly.http.ProcessorTask.InvokeApter(ProcessorTask.java:824)
在com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:721)
位于com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1014)
位于com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:220)
位于com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
在com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)上
在com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)上
http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
位于com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
在com.sun.grizzly.SelectionKeyContextTask.call上(SelectionKeyContextTask.java:57)
位于com.sun.grizzly.ContextTask.run(ContextTask.java:69)
位于com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:530)
位于com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:511)
运行(Thread.java:637)
即使我向基类添加了一个无参数构造函数,Weld仍然会抱怨这个类是不可代理的,因为它有final方法。为什么WELD强迫我改变课堂设计?使用JSF@ManagedBean注释,一切都很好
我将感谢任何帮助。
感谢
提奥
为什么WELD强迫我改变课堂设计?使用JSF@ManagedBean注释,一切都很好
嗯,Weld/CDI的工作方式不同。我的理解是,当您使用注入来获取对bean的引用时,在大多数情况下,您得到的是一个代理对象。这个代理对象对bean进行子类化,并覆盖实现委托的方法。这对CDI可以代理的类引入了一些限制
CDI规范是这样描述的:
5.4.1. 不可验证的bean类型
某些合法bean类型不能被删除
由容器代理:
- 没有非私有构造函数且没有 参数
- 声明为final或具有final方法的类
- 基本类型
- 和数组类型
@Default
@Named("pf_pointOfContactController")
@SessionScoped
public class pf_PointOfContactController implements Serializable {
@PostConstruct
protected void init() {
@Descendant
@Named("pf_orderCustomerPointOfContactController")
@SessionScoped
public class pf_OrderCustomerPointOfContactController extends pf_PointOfContactController {
@PostConstruct
public void init(){
super.init();