如何在 spring 引导请求参数中使用的 class 字段值上设置默认值

How to set default value on field values in a class used in spring boot request parameter

我正在创建一个如下所示的 GetEndpoint

@GetMapping
public void someMethod(@RequestParam(value = "selectedColor", required = false, 
                          defaultValue = "WHITE") Color seletedColor) {

....

}

我需要将所有方法参数转换为如下所示的 class 对象。请让我知道如何在 class

下面的字段级别设置默认值 defaultValue = "WHITE"
@GetMapping
public void someMethod(RequestParameter request) {

....

}

public Class RequestParameter {
    // How to set default value if parameter is null
    private Color seletedColor;
}

我建议使用 getter 来实现这种逻辑。例如:

public class RequestParameter {
   ...

   public Color getSelectedColor() {
      return Optional.ofNullabe(selectedColor).orElse(Color.WHITE);
   }

}

一旦您决定将 params 绑定到自定义请求参数 class,您将无法再利用内置的参数注释来轻松设置默认值。

如果您仍想为请求 class 的字段级参数之一设置每个端点的默认值,实际上并不太难。

制作您自己的自定义 HandlerMethodArgumentResolver 并将其与解析器可以检查的自定义注释配对。

public class MyRequestParameterMethodArgumentResolver implements HandlerMethodArgumentResolver {
    public static final String DEFAULT_COLOR = "ffffff";

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterType().equals(MyRequestParameter.class);
    }

    @Override
    public Object resolveArgument(
            MethodParameter parameter,
            ModelAndViewContainer mavContainer,
            NativeWebRequest webRequest,
            WebDataBinderFactory binderFactory) {
        String colorParam = webRequest.getParameter("color");

        // defaultColor may be overridden per-endpoint using this custom parameter annotation
        DefaultColor defaultColorAnnotation = parameter.getParameterAnnotation(DefaultColor.class);
        String defaultColor = defaultColorAnnotation != null ? defaultColorAnnotation.value() : DEFAULT_COLOR;

        Color color = Optional.ofNullable(colorParam).map(Color::decode).orElse(Color.decode(defaultColor));
        return new MyRequestParameter(color);
    }
}

那个解析器当然要注册

public class MyApplication implements WebMvcConfigurer {

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

然后只需定义您的自定义注释

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DefaultColor {
    @AliasFor("value")
    String color() default "";

    @AliasFor("color")
    String value() default "";
}

最后,您可以自由地为每个端点指定自己的默认颜色

@GetMapping
public void someMethod( @DefaultColor("ff0000") MyRequestParameter requestParams) {

....

}

@GetMapping
public void someOtherMethod( @DefaultColor("00ff00") MyRequestParameter requestParams) {

....

}