java - Jersey : "couldn' t 找到语法元素是什么意思?

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

最佳答案

我也收到了相同的“信息”消息。我还没有为基本的 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>

关于java - Jersey : "couldn' t 找到语法元素是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15767973/

相关文章:

ios - 可能从 JSON 数据对象解码的 Codable 结构数组

java - 使用 AtlasMap 将 xml 转换为 json

javascript - 循环嵌套 JavaScript 数组时出现问题

android - 改造获取响应 null @post 方法

java - 放心 获取响应大小(以 KB 为单位)

java - 隐藏魔方内部接线

java - 将 JSR 303 Java Bean Validation 异常转换为自定义异常

java - Java 风格的 Groovy 和 Java 一样快吗?

java - 使用 Java 和/或 Swing 实现动态 ComboBox 的最简单方法是什么?

java - 将 REST API 部署到 AWS