当前位置: 首页 > 面试题库 >

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

杨和蔼
2023-03-14
问题内容

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


 类似资料:
  • 问题内容: 我是Web服务的新手,因此我从基本示例开始。这与文件上传有关。我正在为非Maven开发人员使用最新(2.17)版本的Jersey捆绑包。它指出: 捆绑包包含JAX-RS 2.0 API jar,所有核心Jersey模块jar以及所有必需的3rd-party依赖关系 。问题是我无法编译此部分: 尽管文档说确实存在,但似乎在Jersey 2.17软件包中并不存在。2.17捆绑包是否不完整?

  • 我目前使用的是球衣 我现在要做的是设置泽西,这样当查询参数进来时(比如缩进),我可以告诉Jackson以“更漂亮的格式,也就是缩进”序列化JSON。您可以通过使用SerializationConfig.Feature.INDENT_OUTPUT配置JSON映射器来轻松地告诉Jackson这样做。 问题是,我如何在每个请求的基础上获取一个queryparam并使用它来修改Jackson的输出?

  • 我正在Google应用引擎中部署一个使用Jersey的示例应用程序。然而,当我尝试对REST资源执行GET或POST时,我得到一个-404 NOT FOUND错误。看来我漏掉了什么。 REST资源代码: 我包括了以下几个罐子: Jar Jersey-Client-1.12.Jar Jersey-Core-1.12.Jar Jersey-JSON-1.12.Jar Jersey-Server-1.1

  • 问题内容: 我有一个Jersey REST API,并且正在使用来处理授权。我还在所有端点上使用,以便我的API可以处理数千个并发请求。 我的授权过滤器命中了一个远程服务,但是当运行过滤器时,Jersey尚未将当前线程添加到它的内部,因此我完全失去了异步的好处。 我可以告诉Jersey我希望这是异步的吗? 这是一个示例资源: 更新 刚刚收到泽西队球员的回音,从2.7开始,这是不可能的。只有资源方法

  • 我很难理解泽西岛的注入机制。JAX-RS规范(http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-520005)指出,在应用程序子类、根资源类和提供程序中可以通过@Context进行注入。 我现在有一个在启动时实例化的类,并且有一个在每次请求时调用的方法。在方法内部,我需要访问当前的UriInfo对象。问题是,这个方法不是从我的