如何为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
相关产品推荐
相关产品推荐

