开发中,app端给服务端会传基础参数、其他参数,一般基础参数app端都会传给服务端,其他参数则是根据不同接口传不同参数。若以表单的形式提交的数据:
其中请求参数params就是上文所说的其他参数,而除了它都是基本参数,param的值是json字符串,对于这种请求方式用@RequestParam、@RequestBody都不能满足要求,用spring中自定义的参数解析器恰好可以解决这个问题。
UserParam:
public class UserParam extends BaseParam{
private UserInfoEntity params;//其他参数映射类
public UserInfoEntity getParams() {
return params;
}
public void setParams(UserInfoEntity params) {
this.params = params;
}
public void setParamsFromJson(String json){
UserInfoEntity userInfoEntity = null;
try {
userInfoEntity = JSONUtils.json2pojo(json,UserInfoEntity.class);
} catch (Exception e) {
e.printStackTrace();
}
setParams(userInfoEntity);
}
}
BaseParam(基础参数类):
public class BaseParam {
public String token;
public String channel;
public String clientId;
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public String getChannel() {
return channel;
}
public void setChannel(String channel) {
this.channel = channel;
}
public String getClientId() {
return clientId;
}
public void setClientId(String clientId) {
this.clientId = clientId;
}
}
@RestController
public class HelloController {
@Autowired
UserInfoService userInfoService;
@PostMapping(value = "/lios/boot/ok",produces = {"application/json;charset=utf-8"})
public Object ok(UserParam param){
return userInfoService.selectByMobile(param.getParams().getMobile());
}
}
public class CustomArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
Class paramObjClass = methodParameter.getParameterType();
if(BaseParam.class.isAssignableFrom(paramObjClass)){
return true; //参数为BaseParam.class类类型时,则执行resolveArgument方法
}
return false;
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
Class paramObjClass = parameter.getParameterType();//获取参数类类型
Object paramObj = paramObjClass.newInstance();//根据class new 出对象
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())) {
Method method = paramObjClass.getMethod("setParamsFromJson", String.class);//获取到方法setParamsFromJson的对象
method.invoke(paramObj, val[0]);//把params的值当作形参传入
} 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());
}
//把基础参数的值放入UserParam中
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]));
}
}
}
return paramObj;
}
}
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="com.lios.api.resolver.CustomArgumentResolver"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@ImportResource({"classpath*:dispatcher-servlet.xml"})
public class LiosBootApplication extends WebMvcConfigurerAdapter {
public static void main(String[] args) {
SpringApplication.run(LiosBootApplication.class, args);
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
super.addArgumentResolvers(argumentResolvers);
argumentResolvers.add(new CustomArgumentResolver());
}
}