当前位置: 首页 > 知识库问答 >
问题:

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

宫铭
2023-03-14

我试图添加一个带有默认值的请求参数,但是我希望默认值是登录的用户名。

我有一个方法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风格)。还有其他方法可以做到这一点吗?

共有2个答案

芮安顺
2023-03-14

我不确定您是否可以在注释中调用方法,但您可以通过如下方式在@Request estMap调用执行之前获取用户名值。

我认为这可以通过使用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()));
}

进一步阅读

林博厚
2023-03-14

正如Fateddy所建议的,最简单的方法是实现HandlermetodArgumentResolver。

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 {}

为了正确配置,需要对WebMVCConfigureAdapter进行非常小的更改:

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
    argumentResolvers.add(new UsernameHandlerMethodArgumentResolver());
}

就这样。很好。现在我们可以简单地将参数放入控制器endpoint:

@RequestMapping(method = RequestMethod.GET)
public @ResponseBody ResponseEntity<WebUser> getUser(@UserRequest Username username) {
    return ResponseEntity.ok(service.getUser(username, username.toLowerCase()));
}
 类似资料:
  • 如果Integer属性不存在,或者它的当前值为0,并且我一辈子都不能使0比较正常工作,我将尝试将其设置为默认值1。 有没有一种方法可以在同一个注释中同时完成这两项工作?我的一个想法是将null-check和0-check拆分为两个不同的属性,基本上在属性文件中包含,然后将注释更改为,但我尝试的结果都不奏效。 我的命令是:。 该属性最终等于我在命令行中设置的任何值。 关于如何检查不存在和0以及如果两

  • 本文向大家介绍C#默认等于行为。,包括了C#默认等于行为。的使用技巧和注意事项,需要的朋友参考一下 示例 Equals在Object类本身中声明。 默认情况下,Equals具有以下行为: 如果实例是引用类型,则Equals仅当引用相同时才返回true。 如果实例是值类型,则Equals仅当类型和值相同时才返回true。 string是一个特例。它的行为类似于值类型。            

  • 我正在使用spring rest控制器。 这是代码。 如果我使用枚举作为defaultValue我得到注释属性的值Request estParam.defaultValue必须是一个常量表达式。 根据我的理解,它应该接受enum作为默认值。 请给出建议。

  • 为什么上面的代码有编译错误“java:default method equals in interface Table重写java.lang.Object的一个成员”?难道我们不能使用接口默认方法重写hashCode和equals方法吗?假设我在同一个接口中有方法来确定实现这个接口的对象的相等性?

  • 问题内容: Javascript中是否有Python的defaultdict的等效项?这将是一个Javascript数组,其中可为缺少的键返回的值是可定义的。就像是: 如果没有,您将如何实施? 问题答案: 不,这在JavaScript中是不可能的。顺便说一句,您当然是指 对象 (属性值映射)而不是数组。两种解决方案: 将您的对象实现为,旨在完全实现您想要的功能。但是,它只是一个草稿,目前仅在Fir