10

URIテンプレート(RFC 6570)で定義されているように、URI内のパラメーターの値を抽出するJavaスタンドアロン実装はありますか?

私が見つけた最高の実装はrubyの実装です(https://github.com/sporkmonger/addressable

http://code.google.com/p/uri-templates/wiki/Implementations経由でJavaの実装を見つけました:Handy-URI-Templates

これは、最終的なURIへのパラメーター値を持つURIテンプレートの解決をサポートします。残念ながら、逆のことはできません:URIテンプレートに従ってURI内のパラメーター値を抽出します。

JAX-RS(またはRestlet)の実装には、この機能が内部的にあります。しかし、独立して使用できるこの機能モジュールを分離したものはないようです。

誰か別のアイデアがありますか?


ここにspring-Webを使用する例があります:

import org.springframework.web.util.UriTemplate;

public class UriParserSpringImpl implements UriParser {

  private final UriTemplate uriTemplate;
  private final String uriTemplateStr;

  public UriParserSpringImpl(final String template) {
    this.uriTemplateStr = template;
    this.uriTemplate = new UriTemplate(template);
  }

  @Override
  public Map<String, String> parse(final String uri) {
    final boolean match = this.uriTemplate.matches(uri);
    if (!match) {
      return null;
    }
    return uriUtils.decodeParams(this.uriTemplate.match(uri));
  }

  @Override
  public Set<String> getVariables() {
    return Collections.unmodifiableSet(new LinkedHashSet<String>(this.uriTemplate.getVariableNames()));
  }
}

ジャージー用のもう1つ(JAX-RS実装):

import com.sun.jersey.api.uri.UriTemplate;
public class UriParserJerseyImpl implements UriParser {

  private final UriTemplate uriTemplate;

  private final Map<String, String> valuesMaps;

  public UriParserJerseyImpl(final String template) {
    this.uriTemplate = new UriTemplate(template);
    final Map<String, String> valuesMaps = new HashMap<String, String>();
    for (final String prop : this.uriTemplate.getTemplateVariables()) {
      valuesMaps.put(prop, null);
    }
    this.valuesMaps = Collections.unmodifiableMap(valuesMaps);
  }

  @Override
  public Map<String, String> parse(final String uri) {
    final Map<String, String> values = new HashMap<String, String>(this.valuesMaps);
    final boolean match = this.uriTemplate.match(uri, values);
    if (!match) {
      return null;
    }
    return values;
  }

  @Override
  public Set<String> getVariables() {
    return this.valuesMaps.keySet();
  }
}

インターフェース付き:

public interface UriParser {
  public Set<String> getVariables();
  public Map<String, String> parse(final String uri);
}
4

2 に答える 2

-5

java.net.URI

インスタンス化された後にパラメーターを設定することはできませんが、適切なゲッターのセットがあり、新しいものを構築して変更することができます。

于 2015-04-03T15:05:15.377 に答える