泽西岛:“找不到语法元素”是什么意思?

时间:2013-04-02 15:23:17

标签: java json rest jersey

将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的方式存在(潜在)问题。由于以前的版本没有发生,我已经检查了发行说明,但没有发现任何相关内容。

1 个答案:

答案 0 :(得分:11)

我也有同样的“信息”消息。我没有设法修复它(还)基本的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>