Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 使用CDI而不是@ManagedBean:UnproxiableResolutionException,因为超类没有参数构造函数_Jsf 2_Cdi_Jboss Weld - Fatal编程技术网

Jsf 2 使用CDI而不是@ManagedBean:UnproxiableResolutionException,因为超类没有参数构造函数

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>

我正在尝试将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> 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方法的类
  • 基本类型
  • 和数组类型
如果一个注入点 类型不能由t代理
@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();