Java REST异常需要构造函数

Java REST异常需要构造函数,java,web-services,rest,jakarta-ee,Java,Web Services,Rest,Jakarta Ee,我有一个RESTWeb服务,它从一个没有公共空构造函数的类FoodItem返回对象。但是,它包含另一个不是空参数的构造函数 我得到了这个例外 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.WebApplicationEx

我有一个RESTWeb服务,它从一个没有公共空构造函数的类
FoodItem
返回对象。但是,它包含另一个不是空参数的构造函数

我得到了这个例外

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
如您所见,我正在调用静态方法

静态方法的代码为:

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

并且此构造函数是私有的,因此,我不需要公共构造函数来创建对象,在我的web服务中,我调用方法static,这样我就不必创建明确的对象。

这是
Java
中反射的典型用法,许多其他框架也在使用反射来构造对象

这就是POJO或Java bean的一般构造方式(默认):

调用类的默认空构造函数,它必须是
public

在可用字段上调用setter以设置字段值


Springs允许各种方法来构造对象,在您的情况下,您可以尝试使用Jersey+Spring来使用带参数方法的构造函数。

在Java中,如果您不编写构造函数,Java运行时将添加默认构造函数,并用默认值初始化实例。但是,如果您在类中添加构造函数,那么JVM不会添加默认构造函数,您应该添加默认构造函数。JVM在没有定义构造函数的情况下添加默认构造函数的原因是,如果没有定义构造函数,那么您将无法创建该类的对象。但如果您添加了一个构造函数,那么JVM会假设您有一个构造函数,并且使用该构造函数您应该能够创建对象

我不必使用公共构造函数来创建对象,请检查我的编辑您的REST服务器正在尝试实例化没有参数构造函数的FoodItemImpl,并且由于您没有在类中添加参数,因此它是complining。为什么REST尝试从
FoodItemImpl
实例化新对象?????我没有要求我不必使用公共构造函数来创建对象,请检查我的编辑。带参数的构造函数是否调用了无参数构造函数?@Santosh否否,不是
public static FoodItem getInstance(int ID) {
        return new FoodItemImpl(ID);
    }