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

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

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

@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) {

....

}