springboot 前台传复杂对象,controller接收并级联校验bean

一番测试后,得到如下几条经验:

  • 方法1:加上@RequestBody @Valid 绑定生效,校验生效,只有其中一个不行。
    接口参数input(参数名称也不影响)的构造函数不影响参数映射和校验

  • 方法2:使用自定义的HandlerMethodArgumentResolver。实现如下:
    在其中直接通过InputStream来获取请求参数字符串

HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
InputStream is = request.getInputStream();
String jsonParams = IOUtils.toString(is, "UTF-8");
IOUtils.closeQuietly(is);

得到字符串后,利用json工具转成Object对象

ObjectReader objectReader = Jackson2ObjectMapperBuilder.json().build().reader();
JavaType javaType = objectReader.getTypeFactory().constructType(cls);
Object obj = objectReader.forType(javaType).readValue(jsonParams);

然后开始校验

final WebDataBinder binder = webDataBinderFactory.createBinder(nativeWebRequest, obj, cls.getName());
binder.validate(new Object[]{obj});
BindingResult result = binder.getBindingResult();

之后可以对result进行处理,抛异常或者其他操作,最后返回obj

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 29,847评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 129,347评论 18 137
  • CloudJavaBackendSummaries1、开发环境eclipse工程,引入jw仓库的jw-base,3...
    燕京麒麟阅读 565评论 0 0
  • 年少时,憧憬爱情。 爱读诗,特别是情诗。 喜欢情意绵绵,喜欢婉转相思。 总梦想着, 有一天,自己也能有自己的, 情...
    曾某阅读 106评论 0 1
  • 昨天下楼正遇见邻居拧着儿子的耳朵上楼,儿子疼的嗷嗷直叫。问起原因,原来是妈妈让儿子回家写作业,儿子只是嘴里答应着,...
    LH来慧阅读 698评论 2 3
  • 昨天,国王杯,巴塞罗那输了,对手还是被罚下2人的毕尔巴鄂竞技,自然免不了要遭受一番批判。梅西虽然进球,但还是躲不过...
    氧气是个地铁阅读 330评论 0 0
  • 今天在做测试的时候,遇到一个问题,百撕不得其姐。先描述下场景,本想测试索引使用情况:explain select ...
    三斤牛肉阅读 9,252评论 0 2