You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Spring的@ParameterObject设置默认值?

为@ParameterObject设置默认值的解决方案

方案1:字段上添加@RequestParam指定默认值

直接在参数对象的每个字段上标注@RequestParam并设置defaultValue,Spring MVC会在请求未携带对应参数时使用默认值。注意boolean类型的defaultValue要传字符串形式的"true"或"false":

@Data
public class ProfileSearchCriteria {

    @RequestParam(defaultValue = "false")
    private boolean criteria1;

    @RequestParam(defaultValue = "false")
    private boolean criteria2;

    @RequestParam(defaultValue = "false")
    private boolean criteria3;
}

接口层保持原有@ParameterObject注解即可:

public List<Person> getPersons(@ParameterObject SearchCriteria profileSearchCriteria) {
    // 业务代码
}

方案2:自定义类似@PageableDefault的注解+参数解析器

如果想实现和@PageableDefault一样的集中式默认值配置,可以自定义注解并实现参数解析器:

步骤1:自定义默认值注解

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface SearchCriteriaDefault {
    // 定义每个字段的默认值,默认false
    boolean criteria1() default false;
    boolean criteria2() default false;
    boolean criteria3() default false;
}

步骤2:实现参数解析器

这个解析器会先设置注解中定义的默认值,再绑定请求参数覆盖默认值:

public class SearchCriteriaArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterType().equals(SearchCriteria.class) &&
                parameter.hasParameterAnnotation(SearchCriteriaDefault.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
                                  NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        SearchCriteriaDefault defaultAnn = parameter.getParameterAnnotation(SearchCriteriaDefault.class);
        SearchCriteria criteria = new SearchCriteria();
        
        // 初始化默认值
        criteria.setCriteria1(defaultAnn.criteria1());
        criteria.setCriteria2(defaultAnn.criteria2());
        criteria.setCriteria3(defaultAnn.criteria3());
        
        // 绑定请求参数,覆盖默认值
        WebDataBinder binder = binderFactory.createBinder(webRequest, criteria, parameter.getParameterName());
        binder.bind(webRequest);
        
        return criteria;
    }
}

步骤3:注册参数解析器

在Spring MVC配置类中注册自定义解析器:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(new SearchCriteriaArgumentResolver());
    }
}

步骤4:接口层使用自定义注解

public List<Person> getPersons(@ParameterObject @SearchCriteriaDefault SearchCriteria profileSearchCriteria) {
    // 业务代码
}

如果需要修改默认值,直接在注解中指定即可:

@SearchCriteriaDefault(criteria1 = true, criteria3 = true)

方案3:构造方法绑定参数(配合@RequestParam)

通过构造方法接收参数,并在构造方法参数上标注@RequestParam设置默认值,Spring MVC会优先使用构造方法创建对象:

@Data
public class ProfileSearchCriteria {
    private boolean criteria1;
    private boolean criteria2;
    private boolean criteria3;

    public ProfileSearchCriteria(
            @RequestParam(defaultValue = "false") boolean criteria1,
            @RequestParam(defaultValue = "false") boolean criteria2,
            @RequestParam(defaultValue = "false") boolean criteria3) {
        this.criteria1 = criteria1;
        this.criteria2 = criteria2;
        this.criteria3 = criteria3;
    }

    // 保留无参构造,避免Spring初始化报错
    public ProfileSearchCriteria() {}
}

接口层同样保持@ParameterObject注解不变。


内容的提问来源于stack exchange,提问作者Ludovic Mouline

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 08:40:30