2016-03-21 46 views
2

我試圖添加一個默認值的請求參數 - 但是我想這個默認值是登錄用戶的名字。RequestParam的春季默認值等於方法調用

我有一個方法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,如果空填充它 - 但這並不感到很優雅(或彈簧ISH)。有沒有另外一種方法來完成這個?

+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