Java 如何在spring引导请求参数中使用的类中设置字段值的默认值
我正在创建一个GetEndpoint,如下所示Java 如何在spring引导请求参数中使用的类中设置字段值的默认值,java,spring,spring-boot,annotations,spring-annotations,Java,Spring,Spring Boot,Annotations,Spring Annotations,我正在创建一个GetEndpoint,如下所示 @GetMapping public void someMethod(@RequestParam(value = "selectedColor", required = false, defaultValue = "WHITE") Color seletedColor) { .... } 我需要将所有方法参数转换为如下所示的类对象。请告诉我如何在下面的课程中设置字段级别的默认值defaul
@GetMapping
public void someMethod(@RequestParam(value = "selectedColor", required = false,
defaultValue = "WHITE") Color seletedColor) {
....
}
我需要将所有方法参数转换为如下所示的类对象。请告诉我如何在下面的课程中设置字段级别的默认值defaultValue=“WHITE”
@GetMapping
public void someMethod(RequestParameter request) {
....
}
public Class RequestParameter {
// How to set default value if parameter is null
private Color seletedColor;
}
我建议使用
getter
来实现此逻辑。例如:
公共类请求参数{
...
公共颜色getSelectedColor(){
返回可选的.ofNullabe(selectedColor).orElse(Color.WHITE);
}
}
一旦您决定将参数绑定到自定义请求参数类,您就不能再利用内置的参数注释来轻松设置默认值
如果您仍然希望为请求类的某个字段级参数设置每个端点的默认值,那么实际上并不难
制作您自己的自定义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());
}
...
最后,您可以自由地为每个端点指定自己的默认颜色
@GetMapping
public void someMethod( @DefaultColor("ff0000") MyRequestParameter requestParams) {
....
}
@GetMapping
public void someOtherMethod( @DefaultColor("00ff00") MyRequestParameter requestParams) {
....
}
如果你想让更多的端点尝试使用Swagger(),它在这种情况下非常有用只需指定一个值
private Color selectedColor=Color.WHITE
。当它在请求中不可用时,它将具有默认值。谢谢@M.Deinum it works您通常希望避免具有副作用的getter。创建对象时,只需为字段指定一个值,如果在requst中不可用,则不会覆盖并使用该值。
@GetMapping
public void someMethod( @DefaultColor("ff0000") MyRequestParameter requestParams) {
....
}
@GetMapping
public void someOtherMethod( @DefaultColor("00ff00") MyRequestParameter requestParams) {
....
}