如何在 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) {
....
}
我正在创建一个如下所示的 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) {
....
}