2017-01-11 187 views
1

我正在編寫一個POJO,如下所示。java.lang.RuntimeException:無法實例化@Form類。無無參數構造函數

public class EndpointParams implements Serializable { 
    private static final long serialVersionUID = -5269761907708414499L; 

    @QueryParam("pageNum") @DefaultValue("1") private int pageNum; 
    @QueryParam("pageSize") @DefaultValue("25") private int pageSize; 

    public EndpointParams (int pageNum, int pageSize) { 
     this.pageNum = pageNum; 
     this.pageSize = pageSize; 
    } 

    public int getPageNum() { 
     return pageNum; 
    } 

    public void setPageNum(int pageNum) { 
     this.pageNum = pageNum; 
    } 

    public int getPageSize() { 
     return pageSize; 
    } 

    public void setPageSize(int pageSize) { 
     this.pageSize = pageSize; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     // logic here 
    } 

    @Override 
    public int hashCode() { 
     // logic here 
    } 
} 

當我部署我的JBOSS程序,我碰到下面的錯誤

10:12:30,321 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/cq/event-bus]] (ServerService Thread Pool -- 114) JBWEB000289: Servlet com.something.sdlc.rest.application.MyApplication threw load() exception: java.lang.RuntimeException: Unable to instantiate @Form class. No no-arg constructor. 
    at org.jboss.resteasy.core.FormInjector.<init>(FormInjector.java:32) [resteasy-jaxrs-3.0.8.Final.jar:] 
    at org.jboss.resteasy.core.InjectorFactoryImpl.createParameterExtractor(InjectorFactoryImpl.java:116) [resteasy-jaxrs-3.0.8.Final.jar:] 
    at org.jboss.resteasy.cdi.CdiInjectorFactory.createParameterExtractor(CdiInjectorFactory.java:51) [resteasy-cdi-3.0.8.Final.jar:] 
    at org.jboss.resteasy.core.MethodInjectorImpl.<init>(MethodInjectorImpl.java:42) [resteasy-jaxrs-3.0.8.Final.jar:] 
    at org.jboss.resteasy.core.InjectorFactoryImpl.createMethodInjector(InjectorFactoryImpl.java:76) [resteasy-jaxrs-3.0.8.Final.jar:] 
    at org.jboss.resteasy.cdi.CdiInjectorFactory.createMethodInjector(CdiInjectorFactory.java:57) [resteasy-cdi-3.0.8.Final.jar:] 
    at org.jboss.resteasy.core.ResourceMethodInvoker.<init>(ResourceMethodInvoker.java:100) [resteasy-jaxrs-3.0.8.Final.jar:] 
    at org.jboss.resteasy.core.ResourceMethodRegistry.processMethod(ResourceMethodRegistry.java:280) [resteasy-jaxrs-3.0.8.Final.jar:] 
    at org.jboss.resteasy.core.ResourceMethodRegistry.register(ResourceMethodRegistry.java:251) [resteasy-jaxrs-3.0.8.Final.jar:] 
    at org.jboss.resteasy.core.ResourceMethodRegistry.addResourceFactory(ResourceMethodRegistry.java:221) [resteasy-jaxrs-3.0.8.Final.jar:] 
    at org.jboss.resteasy.core.ResourceMethodRegistry.addResourceFactory(ResourceMethodRegistry.java:193) [resteasy-jaxrs-3.0.8.Final.jar:] 
    at org.jboss.resteasy.core.ResourceMethodRegistry.addResourceFactory(ResourceMethodRegistry.java:179) [resteasy-jaxrs-3.0.8.Final.jar:] 
    at org.jboss.resteasy.core.ResourceMethodRegistry.addResourceFactory(ResourceMethodRegistry.java:156) [resteasy-jaxrs-3.0.8.Final.jar:] 
    at org.jboss.resteasy.core.ResourceMethodRegistry.addPerRequestResource(ResourceMethodRegistry.java:75) [resteasy-jaxrs-3.0.8.Final.jar:] 
    at org.jboss.resteasy.spi.ResteasyDeployment.registration(ResteasyDeployment.java:430) [resteasy-jaxrs-3.0.8.Final.jar:] 
    at org.jboss.resteasy.spi.ResteasyDeployment.start(ResteasyDeployment.java:241) [resteasy-jaxrs-3.0.8.Final.jar:] 
    at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.init(ServletContainerDispatcher.java:112) [resteasy-jaxrs-3.0.8.Final.jar:] 
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.init(HttpServletDispatcher.java:36) [resteasy-jaxrs-3.0.8.Final.jar:] 
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1194) [jbossweb-7.4.8.Final-redhat-4.jar:7.4.8.Final-redhat-4] 
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1100) [jbossweb-7.4.8.Final-redhat-4.jar:7.4.8.Final-redhat-4] 
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:3591) [jbossweb-7.4.8.Final-redhat-4.jar:7.4.8.Final-redhat-4] 
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:3798) [jbossweb-7.4.8.Final-redhat-4.jar:7.4.8.Final-redhat-4] 
    at org.jboss.as.web.deployment.WebDeploymentService.doStart(WebDeploymentService.java:161) [jboss-as-web-7.4.0.Final-redhat-19.jar:7.4.0.Final-redhat-19] 
    at org.jboss.as.web.deployment.WebDeploymentService.access$000(WebDeploymentService.java:59) [jboss-as-web-7.4.0.Final-redhat-19.jar:7.4.0.Final-redhat-19] 
    at org.jboss.as.web.deployment.WebDeploymentService$1.run(WebDeploymentService.java:94) [jboss-as-web-7.4.0.Final-redhat-19.jar:7.4.0.Final-redhat-19] 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [rt.jar:1.8.0_77] 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [rt.jar:1.8.0_77] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_77] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_77] 
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_77] 
    at org.jboss.threads.JBossThread.run(JBossThread.java:122) 

爲了解決這個問題,我必須包括如下的無參構造函數。

public EndpointParams() { 
} 

一旦我將其包含在我的POJO中,部署成功。 我想知道的是,爲什麼我需要明確包含無參數構造函數,即使我沒有在整個應用程序中使用它?我在我的應用程序中有幾個其他POJO,我有不是包括無參數構造函數,並且一切正常。 我想知道在什麼情況下,我應該明確指定no-arg構造函數。 PS:我正在使用RestEasy,CDI,JBOSS。

回答

2

這就是它如何適用於@Form/@BeanParam。 RESTEasy將嘗試使用no-arg構造它,然後填充屬性。它不知道如何調用你的自定義構造函數。它不像其他服務(使用CDI)或甚至反序列化(與傑克遜一樣)通過相同的DI系統。使用這兩者中的任何一個,都允許創建自定義構造函數。但這些是不同的系統。

+0

你能指點我一些文件嗎? –

+0

http://docs.jboss.org/resteasy/docs/3.1.0.Final/userguide/html/_Form.html。第二句話。 –

+0

謝謝。但是我在頁面上看不到任何關於無參數構造函數的內容。 –

0

您將創建對象的過程委託給使用Jackson或Jettison的resteasy。

我猜這些庫使用反射來實例化新的對象,這樣的事情:

EndpointParams object = Class.forName("EndpointParams").newInstance(); 

,然後,它調用你的查詢參數的制定者(因爲你的註釋):

object.setPageNum(xxx); 
object.setPageSize(yyy); 

事實上,我不知道如何使用構造函數public EndpointParams (int pageNum, int pageSize)來估計pageNum和pageSize的值。這可能是爲什麼一個沒有參數的構造函數對於這樣的類庫是強制性的。

而且,當您使用參數定義構造函數時,會刪除默認構造函數(不帶參數):只有在類中沒有定義其他構造函數時纔會使用默認構造函數。在這種情況下,你必須明確地寫出沒有參數的構造函數,就像你一樣。

相關問題