新泽西(Jersey):什么是“找不到语法元素”的意思?

9

将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;
}

我的第一印象是,基于信息的措辞(“找不到”),我认为这是一个错误信息。然而,它以INFO级别记录,并且在实践中似乎没有任何影响,因为所有服务都能正常运行。

所以我的问题是,这些日志消息是否表明我们配置或使用Jersey的方式存在(潜在的)问题。由于它在先前版本中没有发生过,我已经检查了发布说明,但没有发现相关内容。


抱歉,在匿名化示例代码时出了问题,现在正在修复。 - Kees Kist
1个回答

14

我也遇到了同样的“info”消息。对于基本的Java类型(Boolean,String ...),我还没有修复它(但),但是对于我的自定义类,如果我添加@XmlRootElement注释和一个默认的无参构造函数,则该消息会消失。

深入研究jersey源代码后,我注意到类"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>

你是将init-param放在web.xml文件中还是连接到某个条目中? - Michael
是的,在 web.xml 文件中,位于 Jersey Servlet 元素内部。 - Kim D.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接