1

当我尝试从字符串创建 Java Jersey Link 对象时出现链接解析错误,并且字符串中的 URI 具有矩阵参数。

这是重现异常的简单方法:

String linkString = "<http://localhost:8085/myapp/testversions/files/big.jpg;version=1>; rel=\"source\"";
Link lnk = Link.valueOf(linkString);

第二条语句引发解析错误异常。

如果我删除矩阵参数,事情就很好了:

String linkString = "<http://localhost:8085/myapp/testversions/files/big.jpg>; rel=\"source\"";
Link lnk = Link.valueOf(linkString);

知道有什么问题吗?

4

1 回答 1

0

这是Jersey 2.4 中的一个错误。使用非常简单的方法解析输入org.glassfish.jersey.message.internal.LinkProvider.initBuilder()

StringTokenizer st = new StringTokenizer(value.trim(), "<>;=\"", true);
try {
  checkToken(st, "<");
  lb.uri(st.nextToken().trim());
  checkToken(st, ">");
  while (st.hasMoreTokens()) {
    checkToken(st, ";");
    String n = st.nextToken().trim();
    checkToken(st, "=");
    checkToken(st, "\"");
    String v = st.nextToken();
    checkToken(st, "\"");
    lb.param(n, v);
  }
} catch (Throwable e) {
  lb = null;
}

这假设令牌按以下顺序出现:

  1. <
  2. >
  3. ;
  4. =
  5. "
  6. "

但是您的输入会产生这些标记:

  1. <
  2. ;
  3. =
  4. >
  5. ;
  6. =
  7. "
  8. "

所以泽西关于第二个记号是 a 的假设>不成立。checkToken(st, ">")抛出异常。

当然矩阵参数必须是有效的。Link.valueOf(String)应该实现RFC 5988GitHub 上的当前代码似乎解决了这个问题。

于 2013-11-07T13:46:28.527 回答