java - Spring默认的RequestParam值等于方法调用

标签 java spring spring-mvc annotations http-request-parameters

我正在尝试添加一个具有默认值的请求参数 - 但我希望该默认值是登录用户的名称。

我有一个方法 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 不再是必需的,并在为 null 时填充它 - 但这感觉不太优雅(或 spring-ish)。还有其他方法可以实现这一点吗?

最佳答案

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

就是这样。很好,可以走了。现在我们可以简单地将参数放入 Controller 端点:

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

关于java - Spring默认的RequestParam值等于方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36137133/

相关文章:

java - 什么是 Facelets?它与 JSF 有何关系?

java - 如何在 Spring MVC Web 应用程序中从 Tomcat 自定义目录读取文件

java - 覆盖属性文件中数据库连接的超时

java - 填充 SOAP 信封

java - 如何清除onValidate()引起的类(表单)相关错误?

java - 根据休息标准,哪个休息 API url 更好?

java - 在 Java 中上传文件时重置 InputStream

spring - 在 spring mvc 中使用 @component 注解注释的 Spring 类的范围是什么?

java - 继承 - 尝试理解它是如何工作的

java - Spring中使用@Async插入数据库