1、比如日期 我们可以是yyyy-MM-dd 亦可以是 yyyy-MM-dd HH:mm:ss
方法1在java代码中需要的字段上加上注解 写上日期类型,不过这样很麻烦,每个人写了日期类型的接收前端的参数时都要自己注入,一不小心就有前端来找你接口500了,所以这个方法一有点自私 我不用。
方法2 一起xml写好到处都可以用
<mvc:annotation-driven validator="validator"> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss"/> </bean> </property> </bean> </property> </bean> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg type="java.lang.String" value="yyyy-MM-dd"/> </bean> </property> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
2、如果是传参很多的情况下,我们需要将参数分组,比如基本参数和业务参数,
{appVersion,
device,
..
params
}
而这个params中参数是以个json时后端也一样可以解析,我们写一个参数解析类,直接上代码
package com.xxx.xx.xxx.resolver; import com.xxx.xxx.xxx.BaseParam; import org.springframework.core.MethodParameter; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Map; public class CustomArgumentResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter methodParameter) { Class paramObjClass = methodParameter.getParameterType(); if(BaseParam.class.isAssignableFrom(paramObjClass)){ return true; } return false; } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { Class paramObjClass = parameter.getParameterType(); Object paramObj = paramObjClass.newInstance(); Map<String, String[]> param = webRequest.getParameterMap(); for (Map.Entry<String, String[]> entry : param.entrySet()) { String[] val = entry.getValue(); if (val != null && "params".equals(entry.getKey())) { if(val[0].length()<3){//空json处理 continue; } Method m1 = paramObjClass.getMethod("setParamsFromJson", String.class); m1.invoke(paramObj, val[0]); } else if (val != null && val.length == 1) { Field field =null; if(paramObjClass.getName().equals(BaseParam.class.getName())){ //基础类 field=paramObjClass.getDeclaredField(entry.getKey()); }else { field= paramObjClass.getSuperclass().getDeclaredField(entry.getKey()); } if (field.getType().isAssignableFrom(String.class)) { field.set(paramObj, val[0]); } else if (field.getType().isAssignableFrom(Integer.class)) { field.set(paramObj, Integer.valueOf(val[0])); } else if (field.getType().isAssignableFrom(Long.class)) { field.set(paramObj, Long.valueOf(val[0])); } else if (field.getType().isAssignableFrom(Float.class)) { field.set(paramObj, Float.valueOf(val[0])); } } } return paramObj; } }
mvc接收参数 ,BaseParam是基础参数定义类
package com.xxx.xxx.xxx.blacklist; import com.xxx.common.utils.JSONUtils; import com.xxx.xx.xxx.BaseParam; import java.io.Serializable; public class UserBlackListRequest extends BaseParam implements Serializable { //这个类才是前端在params中塞的json对象 private UserBlackListParam params; public UserBlackListParam getParams() { return params; } public void setParams(UserBlackListParam params) { this.params = params; } public void setParamsFromJson(String jsonStr) { UserBlackListParam dto = null; try { dto = JSONUtils.json2pojo(jsonStr, UserBlackListParam.class); } catch (Exception e) { e.printStackTrace(); } setParams(dto); } }
最后再写一个注入拦截器
<mvc:annotation-driven> <mvc:argument-resolvers> <bean class="com.xxx.xx.xxx.resolver.CustomArgumentResolver"/>
</mvc:argument-resolvers> </mvc:annotation-driven>