2013-05-16 158 views
3

我有一個休息Web服務,它返回沒有公共空構造函數的類FoodItem中的對象。但是,它包含另一個不是空參數的構造函數。REST異常需要構造函數

我得到這個例外

May 15, 2013 11:06:50 PM com.sun.jersey.spi.container.ContainerResponse logException 
SEVERE: Mapped exception to response: 500 (Internal Server Error) 
javax.ws.rs.WebApplicationException: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions 
com.mypackage.eattel.food.FoodItemImpl does not have a no-arg default constructor. 
    this problem is related to the following location: 
     at com.mypackage.eattel.food.FoodItemImpl 

    at com.sun.jersey.core.provider.jaxb.AbstractRootElementProvider.writeTo(AbstractRootElementProvider.java:159) 
    at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:306) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1479) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1391) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1381) 
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) 
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538) 
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions 
com.mypackage.eattel.food.FoodItemImpl does not have a no-arg default constructor. 
    this problem is related to the following location: 
     at com.mypackage.eattel.food.FoodItemImpl 

    at com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(Unknown Source) 
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(Unknown Source) 
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(Unknown Source) 
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(Unknown Source) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at javax.xml.bind.ContextFinder.newInstance(Unknown Source) 
    at javax.xml.bind.ContextFinder.find(Unknown Source) 
    at javax.xml.bind.JAXBContext.newInstance(Unknown Source) 
    at javax.xml.bind.JAXBContext.newInstance(Unknown Source) 
    at com.sun.jersey.core.provider.jaxb.AbstractJAXBProvider.getStoredJAXBContext(AbstractJAXBProvider.java:194) 
    at com.sun.jersey.core.provider.jaxb.AbstractJAXBProvider.getJAXBContext(AbstractJAXBProvider.java:187) 
    at com.sun.jersey.core.provider.jaxb.AbstractJAXBProvider.getMarshaller(AbstractJAXBProvider.java:165) 
    at com.sun.jersey.core.provider.jaxb.AbstractJAXBProvider.getMarshaller(AbstractJAXBProvider.java:144) 
    at com.sun.jersey.core.provider.jaxb.AbstractRootElementProvider.writeTo(AbstractRootElementProvider.java:151) 
    ... 24 more 

當我公開的空參數的構造函數在我FoodItem類,異常解決,我得到了確切的結果。

我的問題: 如何解決該異常不添加空的構造?這是我的業務邏輯不可能有空的構造。

在此先感謝

編輯 我的類實現一個接口,也許這些信息可以幫助你。

EDIT2 如果你想要的代碼爲我的web.xml,我的班,我的接口或我的web服務我準備

EDIT3

這是在Web服務代碼

@GET 
    @Produces(MediaType.TEXT_XML) 
    public FoodItem getRestarantsFordBrowser() { 
     return FoodItemImpl.getInstance(1); 
    } 

如你所見,我打電話給Static方法。

靜態方法的代碼是:

public static FoodItem getInstance(int ID) { 
     return new FoodItemImpl(ID); 
    } 

這個構造函數是私有的,所以我並不需要一個公共的構造函數來創建對象,並在我的web服務我打電話的方法靜態的,所以我不必創建對象明確性。

+0

構造函數的參數是否調用no-arg構造函數? – Santosh

+0

@Santosh no no,它不是 – user2387331

回答

1

在Java中,如果不寫一個構造函數,默認構造函數將被java運行時添加並且實例將使用默認值進行初始化。但是,如果您在類中添加構造函數,那麼JVM不會添加默認構造函數,而應該添加默認構造函數。其原因在於,爲什麼JVM在沒有constructor定義的情況下添加默認構造函數是因爲如果不是,那麼您將無法創建該類的對象。但是如果你添加了一個構造函數,那麼JVM假定你有一個構造函數,並且使用那個你應該能夠創建對象。

+0

我不必使用公共構造函數來創建對象,請檢查我的編輯請求 – user2387331

+0

您的REST服務器試圖實例化沒有參數構造函數的FoodItemImpl,因爲你沒有添加到你的類中,所以它正在進行壓縮。 –

+1

爲什麼REST試圖從'FoodItemImpl'實例化一個新對象?????我沒有要求 – user2387331

0

這是在Java中反射的典型用法,它也被許多其他框架所使用,它也使用反射來構造對象。

這是怎麼一般POJO或Java bean是構建(默認):

調用類的默認是空的構造函數,它必須是public

可用字段設置字段值調用setter方法

彈簧允許各種方式來構造對象,在你的情況下,你可以嘗試使用Jersey + Spring來使用帶參數方法的構造函數。

+0

我不必使用公共構造函數來創建對象,請檢查我的編輯請 – user2387331