HTML5技术

如何解决CRUD操作中与业务无关的字段赋值 - min.jiang(2)

字号+ 作者:H5之家 来源:H5之家 2016-04-15 18:00 我要评论( )

ModifyModel modifyModel = new ModifyModel();modifyModel.setUserId(getCurrentEmployee().getId());modifyModel.setUserName(getCurrentEmployee().getName()); if (request.getId() == 0 ) {ModelHelper.buildC

ModifyModel modifyModel = new ModifyModel(); modifyModel.setUserId(getCurrentEmployee().getId()); modifyModel.setUserName(getCurrentEmployee().getName()); if (request.getId() == 0) { ModelHelper.buildCreateAndModify(request, modifyModel, true); deptService.insert(request); } else { ModelHelper.buildCreateAndModify(request, modifyModel, false); deptService.updateByPrimaryKey(request); }


  我们可以利用参数注入来解决。参数注入的理念就是在spring mvc接收到前台请求的参数后,进一步对接收到的参数做处理以达到预期的效果。我们来创建ManageModelConfigMethodArgumentResolver,它需要实现HandlerMethodArgumentResolver,这个接口看起来比较简单,包含两个核心方法:

  •  判断是否是需要注入的参数,一般通过判断参数上是否有特殊的注解来实现,也可以增加一个其它的参数判断,可根据具体的业务做调整,我这里只以是否有特殊注释来判定是否需要参数注入。
  • @Override public boolean supportsParameter(MethodParameter parameter) { return parameter.hasParameterAnnotation(ManageModelConfig.class); }

  •  参数注入,它提供了一个扩展入口,让我们有机会对接收到的参数做进一步的处理。
  • @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { Object manageModel =getRequestResponseBodyMethodProcessor().resolveArgument(parameter, mavContainer, webRequest, binderFactory); ServletRequest servletRequest = webRequest.getNativeRequest(ServletRequest.class); Employee currentUser = (Employee) servletRequest.getAttribute(DEFAULT_ATTRIBUTE_GET_USER_FROM_REQUEST); if (null == currentUser) { return manageModel; } ManageModelConfig parameterAnnotation = parameter.getParameterAnnotation(ManageModelConfig.class); ModelHelper.setDefaultAndSystemFieldsValue(manageModel, currentUser,parameterAnnotation.isSetDefaultFieldsValue()); return manageModel; }

        这段函数有几处核心逻辑:

  • 取得参数对象,因为我们处理的是ajax请求的参数,最简单的注入方法就是得到实际参数通过反射去处理默认字段以及系统的值。ajax请求与form表单post提交的数据绑定略有不同,可参考之前文章分享的列表页动态搜索的参数注入(列表页的动态条件搜索)。获取当前请求参数对象,我们可以借助如下两个对象配合来完成:
  • RequestMappingHandlerAdapter
  • RequestResponseBodyMethodProcessor
  • private RequestMappingHandlerAdapter requestMappingHandlerAdapter=null; private RequestResponseBodyMethodProcessor requestResponseBodyMethodProcessor = null; private RequestResponseBodyMethodProcessor getRequestResponseBodyMethodProcessor() { if(null==requestMappingHandlerAdapter) { requestMappingHandlerAdapter=new RequestMappingHandlerAdapter(); } if (null==requestResponseBodyMethodProcessor) { List<HttpMessageConverter<?>> messageConverters = requestMappingHandlerAdapter.getMessageConverters(); messageConverters.add(new MappingJackson2HttpMessageConverter()); requestResponseBodyMethodProcessor = new RequestResponseBodyMethodProcessor(messageConverters); } return requestResponseBodyMethodProcessor; }

        通过如下代码就可以取到参数对象了,其实就是让spring mvc重新解析了一遍参数。

    Object manageModel =getRequestResponseBodyMethodProcessor().resolveArgument(parameter, mavContainer, webRequest, binderFactory);

  • 如何获取当前用户,我们在成功登录系统后,将当前用户的信息存储在request中,然后就可以在函数中获取当前用户,也可以采用其它方案,比如ThreadLocal,缓存等等。
  • ServletRequest servletRequest = webRequest.getNativeRequest(ServletRequest.class); Employee currentUser = (Employee) servletRequest.getAttribute(DEFAULT_ATTRIBUTE_GET_USER_FROM_REQUEST);

  • 调用处理函数解决默认字段以及系统的赋值,可以根据配置来决定是否处理字段默认值。
  •  

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • [移动端] IOS下border-image不起作用的解决办法 - 小路_同学

      [移动端] IOS下border-image不起作用的解决办法 - 小路_同学

      2017-05-02 12:04

    • 如何快速处理线上故障 - 倒骑的驴

      如何快速处理线上故障 - 倒骑的驴

      2017-05-02 12:01

    • 如何在 ASP.NET Core 中发送邮件 - Savorboard

      如何在 ASP.NET Core 中发送邮件 - Savorboard

      2017-05-02 08:02

    • 对于Bootstrap的介绍以及如何使用 - novai-L

      对于Bootstrap的介绍以及如何使用 - novai-L

      2017-04-29 09:00

    网友点评
    i