問題

Jerseyをバージョン1.15から1.17にアップグレードした後、次のメッセージをログに記録し始めました。

 Apr 2, 2013 5:13:06 PM com.sun.jersey.server.wadl.generators.AbstractWadlGeneratorGrammarGenerator attachTypes
INFO: Couldn't find grammar element for class java.lang.String
 

そのようなメッセージを生成するサービスの例:

 @GET
@Path("/bla/{a}")
@Produces("application/json")
public String doStuff(@PathParam("a") String a) {
    return a;
}
 

私の最初の印象は、純粋にメッセージがphrased( "見つかりませんでした")の方法に基づいて、これをエラーメッセージとみなすことです。しかし、それはINFOのレベルで記録されており、すべてのサービスが機能し続けるため、実際には効果がないようです。

だから私の質問は、これらのログメッセージが、Jerseyの設定方法や使用方法に関する(潜在的な)問題を示しているかどうかです。以前のバージョンでは起こらなかったので、私はすでにリリースノートをチェックしましたが、関連するものは見つかりませんでした。

  ベストアンサー

私は同じ "情報"メッセージを持っていました。私は基本的なJava型(Boolean、String ...)のためにそれを(まだ)修正することはできませんでしたが、@XmlRootElementアノテーションとデフォルトのno-paramコンストラクタを追加すると、独自のカスタムクラスに対してメッセージが消えます。

ジャージーのソースコードを掘り下げると、次のコード "WadlGeneratorJAXBGrammarGenerator"クラスに気付きました。

 Object parameterClassInstance = null;
try {
    Constructor<?> defaultConstructor = type.getDeclaredConstructor();
    defaultConstructor.setAccessible(true);
    parameterClassInstance = defaultConstructor.newInstance();
} catch (InstantiationException ex) {
    LOGGER.log(Level.FINE, null, ex);
} catch (IllegalAccessException ex) {
    LOGGER.log(Level.FINE, null, ex);
} catch (IllegalArgumentException ex) {
    LOGGER.log(Level.FINE, null, ex);
} catch (InvocationTargetException ex) {
    LOGGER.log(Level.FINE, null, ex);
} catch (SecurityException ex) {
    LOGGER.log(Level.FINE, null, ex);
} catch (NoSuchMethodException ex) {
    //getting here for Boolean/String and some other primitive data type
    LOGGER.log(Level.FINE, null, ex);
}

if (parameterClassInstance==null) {
    return null;
}
 

したがって、基本的にはString、Booleanなどのデフォルトコンストラクタはなく、NoSuchMethodExceptionがスローされるため、nullを返して情報メッセージを記録します。

なぜそれが起こるのかまだ分かりませんが、私の場合、解決策は私がそれを使用していなかったので、wadl生成を無効にすることでした。 web.xmlに次のパラメータを追加するだけです

   <init-param>
         <param-name>com.sun.jersey.config.feature.DisableWADL</param-name>
         <param-value>true</param-value>
     </init-param>
 

  同じタグがついた質問を見る

javajsonrestjersey