将 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 的方式存在(潜在)问题。由于以前的版本没有发生这种情况,所以我已经检查了发行说明,但没有找到任何相关内容。
我也收到了同样的“信息”消息。对于基本的 java 类型(布尔值、字符串...),我还没有设法修复它,但对于我自己的自定义类,如果我添加 @XmlRootElement 注释和默认的无参数构造函数,消息就会消失。
深入研究球衣源代码,我注意到类“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>
我有类似的问题,我们不专门使用球衣。但看到这些巨大的日志会导致磁盘问题。这可以通过关闭球衣日志来解决。解决方案可以在这里找到