springMVC是比较流行的表现层框架,扩展性比较好,在项目中遇到一个问题:客户端传的参数是与公司规范报文(xml)映射的对象,规范XML是一个四层结构,节点包含四层,按照XML映射关系,将每一层映射为一个实体对象;对象的结果就是父-子-孙-曾孙。而这种结构存储到数据库时,效率极差。因此将存储到数据库的实体对象简化为两层结构,将不会出现循环的节点都放到父类中,出现循环的节点放到子类中。这种情况就需要对前端传入的复杂对象转换为简单对象。而在代码中硬编码的方式是比较low的。就利用springMVC的自定义解析器。
1、创建自定义注解
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface Json {
}
2、创建自定义解析器实现HandlerMethodArgumentResolver接口,实现其中两个方法。其中supportsParameter用来判断方法形参里是否有自定义注解@Json,如果有则返回true。返回true时就会调用自定义的解析器解析方法。
3、实现resolveArgument方法,此为解析和绑定的方法。方法的形参中MethodParameter对象是方法形参的对象,NativeWebRequest是请求对象。通过这两个对象就可以获得请求参数。
获得客户端传的json对象的例子:
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
HttpInputMessage inputMessage = new ServletServerHttpRequest(request);
InputStream inputStream = inputMessage.getBody();
从输入流中就可以读取客户端发送的json数据