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>
|