Spring Hateoas でリンクをレンダリングするためのフレームワークを開発しました。このフレームワークは、注釈付きパラメーター (@PathVariable
および@RequestParam
) と任意のパラメーター タイプをサポートしています。
これらの任意の型をレンダリングするには、com.github.osvaldopina.linkbuilder.argumentresolver.ArgumentResolver
インターフェースを実装する Spring Bean を作成する必要があります。
インターフェイスには 3 つのメソッドがあります。
public boolean resolveFor(MethodParameter methodParameter)
ArgumentResolver
を処理するために を使用できるかどうかを判断するために使用されmethodParameter
ます。例えば:
public boolean resolveFor(MethodParameter methodParameter) {
return UserDefinedType.class.isAssignableFrom(methodParameter.getParameterType());
}
ArgumentResover
これが に使用されることを定義しUserDefinedType
ます。
public void augmentTemplate(UriTemplateAugmenter uriTemplateAugmenter, MethodParameter methodParameter)
メソッドに関連付けられた uriTemplate に適切なテンプレート パーツを含めるために使用されます。例えば:
@Override
public void augmentTemplate(UriTemplateAugmenter uriTemplateAugmenter, MethodParameter methodParameter) {
uriTemplateAugmenter.addToQuery("value1");
uriTemplateAugmenter.addToQuery("value2");
}
URI テンプレートに 2 つのクエリ パラメータ (value1 と value2) を追加します。
public void setTemplateVariables(UriTemplate template, MethodParameter methodParameter, Object parameter, List<String> templatedParamNames)
テンプレート変数の値をテンプレートに設定します。例えば:
@Override
public void setTemplateVariables(UriTemplate template, MethodParameter methodParameter, Object parameter, List<String> templatedParamNames) {
if (parameter != null && ((UserDefinedType) parameter).getValue1() != null) {
template.set("value1", ((UserDefinedType) parameter).getValue1());
}
else {
template.set("value1", "null-value");
}
if (parameter != null && ((UserDefinedType) parameter).getValue2() != null) {
template.set("value2", ((UserDefinedType) parameter).getValue2());
}
else {
template.set("value2", "null-value");
}
}
インスタンスを取得し、UserDefinedType
それを使用して、メソッドで定義されたテンプレート変数 value1 および value2 を設定しますaugmentTemplate
。
ArgumentResolver
完全な例は次のとおりです。
@Component
public class UserDefinedTypeArgumentResolver implements ArgumentResolver {
@Override
public boolean resolveFor(MethodParameter methodParameter) {
return UserDefinedType.class.isAssignableFrom(methodParameter.getParameterType());
}
@Override
public void augmentTemplate(UriTemplateAugmenter uriTemplateAugmenter, MethodParameter methodParameter) {
uriTemplateAugmenter.addToQuery("value1");
uriTemplateAugmenter.addToQuery("value2");
}
@Override
public void setTemplateVariables(UriTemplate template, MethodParameter methodParameter, Object parameter, List<String> templatedParamNames) {
if (parameter != null && ((UserDefinedType) parameter).getValue1() != null) {
template.set("value1", ((UserDefinedType) parameter).getValue1());
}
else {
template.set("value1", "null-value");
}
if (parameter != null && ((UserDefinedType) parameter).getValue2() != null) {
template.set("value2", ((UserDefinedType) parameter).getValue2());
}
else {
template.set("value2", "null-value");
}
}
}
および次のリンク ビルダーの場合:
linksBuilder.link()
.withRel("user-type")
.fromControllerCall(RootRestController.class)
.queryParameterForUserDefinedType(new UserDefinedType("v1", "v2"));
次のメソッドに:
@RequestMapping("/user-defined-type")
@EnableSelfFromCurrentCall
public void queryParameterForUserDefinedType(UserDefinedType userDefinedType) {
}
次のリンクが生成されます。
{
...
"_links": {
"user-type": {
"href": "http://localhost:8080/user-defined-type?value1=v1&value2=v2"
}
...
}
}