3

残りの Web サービスがあります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

クラスで空のパラメーターコンストラクターを公開するFoodItemと、例外が解決され、正確な結果が得られました。

私の質問: 空のコンストラクターを追加せずにその例外を解決する方法は?、私のビジネス ロジックでは、空のコンストラクターを持つことは不可能です。

前もって感謝します

編集 私のクラスはインターフェイスを実装しています。この情報が役立つかもしれません。

Edit2web.xml my 、my classes、my interfaces、または my webservice のコードが必要な場合は、準備ができています

編集3

これは、Web サービスのコードです。

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

ご覧のとおり、静的メソッドを呼び出しています。

静的メソッドのコードは次のとおりです。

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

このコンストラクターは PRIVATE であるため、オブジェクトを作成するためにパブリック コンストラクターは必要ありません。Web サービスでは静的メソッドを呼び出しているため、オブジェクトを明示的に作成する必要はありません。

4

2 に答える 2

1

Java では、コンストラクターを記述しない場合、Java ランタイムによってデフォルトのコンストラクターが追加され、インスタンスがデフォルト値で初期化されます。ただし、クラスにコンストラクターを追加すると、JVM はデフォルトのコンストラクターを追加しないため、デフォルトのコンストラクターを追加する必要があります。コンストラクターが定義されていないときに JVM がデフォルトのコンストラクターを追加する理由は、そうでない場合、そのクラスのオブジェクトを作成できないためです。ただし、コンストラクターを追加した場合、JVM はコンストラクターがあると想定し、そのコンストラクターを使用してオブジェクトを作成できるはずです。

于 2013-05-16T06:19:48.523 に答える
0

これはリフレクションの典型的な使用法であり、リフレクションJavaを使用してオブジェクトを構築する他の多くのフレームワークもそれに続いています。

これは、一般的な POJO または Java Bean の構築方法です (デフォルト)。

クラスのデフォルトの空のコンストラクターを呼び出します。public

使用可能なフィールドでセッターを呼び出してフィールド値を設定する

Springs では、さまざまな方法でオブジェクトを構築できます。この場合、Jersey + Spring を使用して、パラメーター アプローチでコンストラクターを使用することができます。

于 2013-05-16T06:19:31.813 に答える