2016-03-21 21 views
2

リクエストパラメータにデフォルト値を追加しようとしていますが、そのデフォルト値をログインしているユーザの名前にしたいと思います。RequestParamのSpringのデフォルト値がメソッド呼び出しと同じ

現在のユーザーの名前を返すgetUsername()メソッドがありますが、メソッド呼び出し(またはクラス属性)に注釈の値を設定できません。ここに私の方法です:

@RequestMapping(method = RequestMethod.GET) 
public @ResponseBody ResponseEntity<WebUser> getUser(
     @RequestParam(value = "username", defaultValue = getUsername()) String username) { 
    return ResponseEntity.ok(service.getUser(getUsername(), username.toLowerCase())); 
} 

私はRequestParamが不要にし、ヌルならば、それを読み込むことができます - しかし、これは非常にエレガント(または春っぽい)感じることはありません。これを達成する別の方法がありますか?

+0

あなたがあなた自身の '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

+0

HandlerMethodArgumentResolverはおそらく私の最善の策だと思います。ヒントをありがとう - 私はこれで前進します。 – cscan

答えて

2

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())); 
} 
0

アノテーションでメソッドを呼び出すことができるかどうかはわかりませんが、@RequestMappingの直前にユーザー名の値を取得することができます。

これは@ModelAttributeを使用して実現できると思います。

@ModelAttribute("username") 
public String getUserName() { 
    String name = "XYZ"; 
    return name; 
} 

あなたの@RequestMappingでは以下のようになります。

@RequestMapping(method = RequestMethod.GET) 
public @ResponseBody ResponseEntity<WebUser> getUser(
     @ModelAttribute("username") String username) { 
    return ResponseEntity.ok(service.getUser(username, username.toLowerCase())); 
} 

Further reading

関連する問題