【常见报错总结】02 SpringBoot项目中EasyCode代码生成的分页参数映射异常:org.springframework.data.domain.PageRequest.<init>()

EasyCode生成的Controller接口

/**
 * 分页查询
 *
 * @param proUser 筛选条件
 * @param pageRequest      分页对象
 * @return 查询结果
 */
@GetMapping
public ResponseEntity<Page<ProUser>> queryByPage(ProUser proUser, PageRequest pageRequest) {
    return ResponseEntity.ok(this.proUserService.queryByPage(proUser, pageRequest));
}
  • 可以看出Controller中有个参数是PageRequest,异常原因是没能将参数正常解析。

异常描述

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: No primary or default constructor found for class org.springframework.data.domain.PageRequest] with root cause

java.lang.NoSuchMethodException: org.springframework.data.domain.PageRequest.<init>()
  • 大概意思是说PageRequest没有无参构造,不能进行实例化赋值
  • 看了网上有些博客说重写PageRequest类什么什么的,我想了下,应该会有更好的方式解决参数映射的问题,于是了解了下SpringMVC的参数是如何映射的。

SpringMVC参数映射

核心就是这个接口,SpringMVC会去匹配这个接口的实现,判断能否用来解析当前方法的参数

  • supportsParameter 是说能否支持当前参数映射,能就是true,反之false
  • resolveArgument 是具体用来解析参数的
public interface HandlerMethodArgumentResolver {

	/**
	 * Whether the given {@linkplain MethodParameter method parameter} is
	 * supported by this resolver.
	 * @param parameter the method parameter to check
	 * @return {@code true} if this resolver supports the supplied parameter;
	 * {@code false} otherwise
	 */
	boolean supportsParameter(MethodParameter parameter);

	/**
	 * Resolves a method parameter into an argument value from a given request.
	 * A {@link ModelAndViewContainer} provides access to the model for the
	 * request. A {@link WebDataBinderFactory} provides a way to create
	 * a {@link WebDataBinder} instance when needed for data binding and
	 * type conversion purposes.
	 * @param parameter the method parameter to resolve. This parameter must
	 * have previously been passed to {@link #supportsParameter} which must
	 * have returned {@code true}.
	 * @param mavContainer the ModelAndViewContainer for the current request
	 * @param webRequest the current request
	 * @param binderFactory a factory for creating {@link WebDataBinder} instances
	 * @return the resolved argument value, or {@code null} if not resolvable
	 * @throws Exception in case of errors with the preparation of argument values
	 */
	@Nullable
	Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
			NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;

}

  • 有了这个接口就很好办了,写个实现类去解析PageRequest就好了,这是方式一
  • 另外一种我觉得比较好的方式是,其实SpringData对解析Pageable提供了实现,但是只能是Pageable类型的,所以我们可以对它进行扩展,让它支持Pageable或者它的子类(PageRequest其实就是Pageable的子类)
@Component
public class PageRequestHandlerMethodArgumentResolver extends PageableHandlerMethodArgumentResolver {

    /**
     * {@link PageableHandlerMethodArgumentResolver} SpringData 提供的只能解析 {@link Pageable} 类型的
     * 这里让它也能解析它的子类 {@link PageRequest}
     *
     * @param parameter
     * @return
     */
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return Pageable.class.isAssignableFrom(parameter.getParameterType());
    }
}
  • 然后再把这个解析器注册到SpringMVC中
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private PageRequestHandlerMethodArgumentResolver pageRequestHandlerMethodArgumentResolver;

    /**
     * 添加自定义参数解析器
     *
     * @param argumentResolvers
     */
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(pageRequestHandlerMethodArgumentResolver);
    }
}
  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: easycode define.vm是一个默认的模板文件,它被EasyCode插件用于生成代码的定义。在EasyCode,我们可以定义各种各样的代码模板,用于快速生成项目常用的代码片段。而define.vm就是其一个默认的模板文件。 在define.vm,我们可以定义代码的结构和格式。比如,我们可以定义类的声明部分、属性部分、方法部分等。这样,在生成代码时,EasyCode插件会根据我们定义的模板文件,自动生成相应的代码。 除了定义代码结构,define.vm还可以定义一些替换变量。这些变量可以根据用户的输入值来替换成相应的内容,从而实现代码片段的定制化。比如,我们可以定义一个${className}的变量,用于替换生成类名的地方。 另外,define.vm可以与其他模板文件进行组合使用。通过定义不同的模板文件,我们可以根据具体的需求生成不同的代码片段。比如,我们可以定义一个entity.vm模板用于生成实体类的代码,然后再定义一个service.vm模板用于生成服务类的代码。这样,我们就可以根据需要选择不同的模板文件,来生成不同种类的代码。 总的来说,easycode define.vm默认模板是EasyCode插件用于生成代码的一种默认模板文件。通过定义结构和替换变量,我们可以定制化生成各种常用代码片段。同时,define.vm也支持与其他模板文件组合使用,用于生成不同类型的代码。 ### 回答2: default模板是EasyCode工具在生成代码时使用的一种默认模板。它是根据EasyCode开发团队的经验和最佳实践所设计的,旨在提供一种简洁、易理解和易于修改的代码生成模板。 define.vm是default模板的一个首要部分,它用于定义需要生成的模块和类的基本信息。在这个模板,我们可以指定模块的名称、路径、包名等等。 通过定义define.vm,我们可以指定生成的代码所属的模块、类的名称以及其他必要的信息。当我们使用EasyCode工具生成代码时,会根据define.vm的定义生成相应的代码文件,并将指定的参数填充到生成的代码。 通过使用default模板和define.vm,我们可以快速生成符合规范和标准的代码,并且省去了重复编写一些重复的代码的时间和精力。同时,我们也可以根据项目的需求自定义和修改default模板和define.vm,以满足自己的需求和项目的特殊要求。 总之,default模板的define.vm是EasyCode工具在生成代码时的一个必要组成部分,它定义了代码生成的基本信息和参数,帮助我们快速生成规范和标准的代码,并提高开发效率。 ### 回答3: EasyCode是一款基于IntelliJ IDEA开发环境的代码生成插件,它提供了多种默认模板,其包括define.vm模板。define.vm模板是用于定义代码生成需要的变量和方法的模板。 在define.vm模板,我们可以自定义各种变量,如类名、包名、属性名等,通过在模板定义这些变量,可以实现自动替换生成的代码对应的地方。我们可以使用`${变量名}`的形式在模板引用这些变量。 此外,define.vm模板还可以定义生成代码时所需的方法。比如,我们可以定义一个生成get和set方法的方法,然后在模板调用这个方法来生成相应的代码块。这样一来,我们就可以通过简单的代码模板定义,生成出包含一些常用方法的类。 通过使用define.vm模板,我们可以减少手动编写重复代码的工作量,提高开发效率。同时,由于模板的灵活性,我们还可以根据项目的需求进行修改和扩展,以满足不同的业务逻辑和代码风格要求。 总之,easycode的define.vm默认模板是用于定义代码生成所需的变量和方法的模板,通过在模板定义变量,我们可以实现自动替换生成的代码对应的地方,通过定义方法,我们可以生成一些常用的代码块,从而提高开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值