1

文字列から Java Jersey Link オブジェクトを作成しようとすると、リンク解析エラーが発生し、文字列内の URI にマトリックス パラメータが含まれています。

例外を再現する簡単な方法を次に示します。

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

2 番目のステートメントは、解析エラーの例外を発生させます。

マトリックス パラメータを削除すると、問題なく動作します。

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. "

したがって、2 番目のトークンが であるという Jersey の仮定は>成立しません。checkToken(st, ">")例外をスローします。

もちろん、行列パラメータは有効でなければなりません。RFC 5988Link.valueOf(String)を実装することになっています。GitHubの現在のコードは、この問題を解決しているようです。

于 2013-11-07T13:46:28.527 に答える