fateddyによって示唆されるように、これを行う最も簡単な方法は、HandlerMethodArgumentResolverを実装することです。
public class UsernameHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.getParameterType().equals(Username.class);
}
@Override
public Object resolveArgument(MethodParameter methodParameter,
ModelAndViewContainer modelAndViewContainer,
NativeWebRequest nativeWebRequest,
WebDataBinderFactory webDataBinderFactory) throws Exception {
String username = nativeWebRequest.getParameter("username");
if (username == null && nativeWebRequest.getUserPrincipal() != null) {
username = nativeWebRequest.getUserPrincipal().getName();
}
return new Username(username);
}
}
これは、単純なユーザー名クラスが必要です。
これが設定され得るために
public class Username {
private String username;
public Username(String username) {
this.username = username;
}
public String getValue() {
return this.username;
}
}
だけでなく、注釈
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface UserRequest {}
適切にこれはWebMvcConfigurerAdapterに非常にマイナーな変更を必要とします。
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new UsernameHandlerMethodArgumentResolver());
}
それだけです。行ってもいい。今、私たちは、単にコントローラエンドポイントに引数をドロップすることができます。
@RequestMapping(method = RequestMethod.GET)
public @ResponseBody ResponseEntity<WebUser> getUser(@UserRequest Username username) {
return ResponseEntity.ok(service.getUser(username, username.toLowerCase()));
}
あなたがあなた自身の 'HandlerMethodArgumentResolver'(http://docs.spring.io/spring/docs/current/javadoc-api/org/を書くことができSpringFramework/web/method/support/HandlerMethodArgumentResolver.html)、またはspring-securityを使用している場合、 '@ AuthenticationPrincipal'アノテーション(http://docs.spring.io/autorepo/docs/spring-security/4.0)を見てください。 3.RELEASE/apidocs/org/springframework/security/core/annotation/AuthenticationPrincipal.html) – fateddy
HandlerMethodArgumentResolverはおそらく私の最善の策だと思います。ヒントをありがとう - 私はこれで前進します。 – cscan