Jsf java.lang.InstantiationException:my.package.CustomActionListener,具有非默认构造函数

Jsf java.lang.InstantiationException:my.package.CustomActionListener,具有非默认构造函数,jsf,serialization,actionlistener,commandbutton,Jsf,Serialization,Actionlistener,Commandbutton,我正在尝试在primefaces 5.1上生成commandButton,但有一个错误: 这里是xhtml文件: 这里是CustomActionListener: public class CustomActionListener implements ActionListener { private int u; public CustomActionListener(int u) { this.u = u; } @Override

我正在尝试在primefaces 5.1上生成commandButton,但有一个错误:

这里是xhtml文件:

这里是CustomActionListener:

public class CustomActionListener implements ActionListener {

    private int u;

    public CustomActionListener(int u) {
        this.u = u;
    }

    @Override
    public void processAction(ActionEvent event) throws AbortProcessingException {
        System.out.println(u);
    }
}
我按下按钮时收到的错误是:

GRAVE: java.lang.InstantiationException: my.package.CustomActionListener
java.lang.IllegalStateException: java.lang.InstantiationException: my.package.CustomActionListener
    at javax.faces.component.StateHolderSaver.restore(StateHolderSaver.java:153)
    at javax.faces.component.AttachedObjectListHolder.restoreState(AttachedObjectListHolder.java:158)
    at javax.faces.component.UIComponentBase.restoreState(UIComponentBase.java:1611)
    at com.sun.faces.application.view.StateHolderSaver.restore(StateHolderSaver.java:165)
    at com.sun.faces.application.view.FaceletPartialStateManagementStrategy.restoreDynamicAdd(FaceletPartialStateManagementStrategy.java:274)
    at com.sun.faces.application.view.FaceletPartialStateManagementStrategy.restoreDynamicActions(FaceletPartialStateManagementStrategy.java:227)
    at com.sun.faces.application.view.FaceletPartialStateManagementStrategy.restoreView(FaceletPartialStateManagementStrategy.java:395)
    at com.sun.faces.application.StateManagerImpl.restoreView(StateManagerImpl.java:138)
    at com.sun.faces.application.view.ViewHandlingStrategy.restoreView(ViewHandlingStrategy.java:123)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.restoreView(FaceletViewHandlingStrategy.java:585)
    at com.sun.faces.application.view.MultiViewHandler.restoreView(MultiViewHandler.java:150)
    at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:197)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:121)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at com.synapsis.catalina.realm.filter.AlertChangePWDBefore.doFilter(AlertChangePWDBefore.java:106)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at com.synapsis.catalina.realm.filter.SingleLogOnFilter.doFilter(SingleLogOnFilter.java:123)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at com.synapsis.catalina.realm.filter.DefaultUserFilter.doFilter(DefaultUserFilter.java:118)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at com.synapsis.sio.ward.usercontext.controller.filter.UserContextFilter.doFilter(UserContextFilter.java:168)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:610)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.authenticator.SingleSignOn.invoke(SingleSignOn.java:339)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.InstantiationException: my.package.CustomActionListener
    at java.lang.Class.newInstance(Class.java:359)
    at javax.faces.component.StateHolderSaver.restore(StateHolderSaver.java:150)
    ... 51 more
如果从构造函数中删除参数,则不会收到此错误。但我需要向CustomerActionListener传递一个参数。
如何修复?

您需要在CustomActionListener中有一个默认构造函数(除了自定义的构造函数)。

忽略奇怪的设计方法(可以自由提问如何正确实现您认为这是正确解决方案的具体功能需求),您可以通过让它实现来解决它。这是
Serializable
上的一个扩展,它允许您接管序列化属性的职责

以下是一个启动示例:

public class CustomActionListener implements ActionListener, Externalizable {

    private int u;

    public CustomActionListener() {
        // Keep default c'tor alive for serialization.
    }

    public CustomActionListener(int u) {
        this.u = u;
    }

    @Override
    public void processAction(ActionEvent event) throws AbortProcessingException {
        System.out.println(u);
    }

    @Override
    public void writeExternal(ObjectOutput output) throws IOException {
        output.writeInt(u);
    }

    @Override
    public void readExternal(ObjectInput input) throws IOException, ClassNotFoundException {
        u = input.readInt();
    }

}

虽然这是真的,但它将导致ActionListener使用未设置的值(重新)构造。因此,他失去了在事件处理中获得“5”的机会。抱歉,路易斯,但我不明白你的意思:直接调用actionListener…但我想从java代码动态创建一个页面。为什么?好奇。还是。。。为什么不创建一个setU(intu)并在构造函数尝试此解决方案后设置它呢。但当我按下按钮时,值为空。这是因为将再次创建CustomActionListener。您试图实现什么(从功能角度,而不是技术角度)?因为代码示例是我以前从未见过的。我想做的是从java代码动态创建一个页面。这方面有很多示例:。。。但是,看起来您想做的有点懒惰,或者更确切地说是更新页面加载的一部分(通过带有autorun=“true”…)的远程命令来做),或者页面在不传递参数时是否实际工作?还是我错过了什么?谢谢你的链接。正如你所见,他们创建了一个actionListener,我也是。但我需要将一些参数传递到构造函数中,或者以其他方式传递。问题是,如果我使用参数生成构造函数,我将出现所描述的错误,否则,使用set方法,我可以看到按钮单击操作将生成一个新的ActionListener,因此我丢失了设置的参数;塞图(5);customButton.addActionListener(al)或类似的东西?(很抱歉格式化…无法在评论中正确表达)对不起,但是为什么你说这是一种奇怪的方法?我需要动态设计页面。。。对于动态,我的意思是,一个登录的客户端用户,可以添加一些输入文本,或表格。。。用这个定义进入一个特定的配置位置。是的,我同意你的看法。但我必须在登录用户处提供这种可能性。你有没有更好的办法给我建议?啊。。你的解决方案确实有效。
GRAVE: java.lang.InstantiationException: my.package.CustomActionListener
java.lang.IllegalStateException: java.lang.InstantiationException: my.package.CustomActionListener
    at javax.faces.component.StateHolderSaver.restore(StateHolderSaver.java:153)
    at javax.faces.component.AttachedObjectListHolder.restoreState(AttachedObjectListHolder.java:158)
    at javax.faces.component.UIComponentBase.restoreState(UIComponentBase.java:1611)
    at com.sun.faces.application.view.StateHolderSaver.restore(StateHolderSaver.java:165)
    at com.sun.faces.application.view.FaceletPartialStateManagementStrategy.restoreDynamicAdd(FaceletPartialStateManagementStrategy.java:274)
    at com.sun.faces.application.view.FaceletPartialStateManagementStrategy.restoreDynamicActions(FaceletPartialStateManagementStrategy.java:227)
    at com.sun.faces.application.view.FaceletPartialStateManagementStrategy.restoreView(FaceletPartialStateManagementStrategy.java:395)
    at com.sun.faces.application.StateManagerImpl.restoreView(StateManagerImpl.java:138)
    at com.sun.faces.application.view.ViewHandlingStrategy.restoreView(ViewHandlingStrategy.java:123)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.restoreView(FaceletViewHandlingStrategy.java:585)
    at com.sun.faces.application.view.MultiViewHandler.restoreView(MultiViewHandler.java:150)
    at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:197)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:121)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at com.synapsis.catalina.realm.filter.AlertChangePWDBefore.doFilter(AlertChangePWDBefore.java:106)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at com.synapsis.catalina.realm.filter.SingleLogOnFilter.doFilter(SingleLogOnFilter.java:123)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at com.synapsis.catalina.realm.filter.DefaultUserFilter.doFilter(DefaultUserFilter.java:118)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at com.synapsis.sio.ward.usercontext.controller.filter.UserContextFilter.doFilter(UserContextFilter.java:168)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:610)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.authenticator.SingleSignOn.invoke(SingleSignOn.java:339)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.InstantiationException: my.package.CustomActionListener
    at java.lang.Class.newInstance(Class.java:359)
    at javax.faces.component.StateHolderSaver.restore(StateHolderSaver.java:150)
    ... 51 more
public class CustomActionListener implements ActionListener, Externalizable {

    private int u;

    public CustomActionListener() {
        // Keep default c'tor alive for serialization.
    }

    public CustomActionListener(int u) {
        this.u = u;
    }

    @Override
    public void processAction(ActionEvent event) throws AbortProcessingException {
        System.out.println(u);
    }

    @Override
    public void writeExternal(ObjectOutput output) throws IOException {
        output.writeInt(u);
    }

    @Override
    public void readExternal(ObjectInput input) throws IOException, ClassNotFoundException {
        u = input.readInt();
    }

}