springMVC接收参数
一、springmvc接收前台json参数
需要用@RequestBody来处理json数据,有以下几种方式,因为JSON被转成了LinkedHashMap只能用Map或者对
象接收
1、创建有关对象来作为接收容器
2、直接用map作为接收容器
3、创建对象并(@ModelAttribute("user") User user)
4、自定义注解
实现方式:
@JsonArg("$.resource") String code
步骤:
1、自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface JsonArg {
public String value() default "";
}
2、实现 HandlerMethodArgumentResolver :
public class JsonArgumentResolver implements HandlerMethodArgumentResolver{
private static final String JSONBODYATTRIBUTE = "JSON_REQUEST_BODY";
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(JsonArg.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
String body = getRequestBody(webRequest);
String arg = parameter.getParameterAnnotation(JsonArg.class).value();
if (StringUtils.isEmpty(arg)) {
arg = parameter.getParameterName();
}
Object val = JsonPath.parse(body).read(arg, parameter.getParameterType());
return val;
}
private String getRequestBody(NativeWebRequest webRequest){
HttpServletRequest servletRequest = webRequest.getNativeRequest(HttpServletRequest.class);
String jsonBody = (String) webRequest.getAttribute(JSONBODYATTRIBUTE,
NativeWebRequest.SCOPE_REQUEST);
if (jsonBody==null){
try {
jsonBody = IOUtils.toString(servletRequest.getInputStream());
webRequest.setAttribute(JSONBODYATTRIBUTE, jsonBody, NativeWebRequest.SCOPE_REQUEST);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return jsonBody;
}
}
3、spring-mvc中声明:
<mvc:annotation-driven>
<mvc:argument-resolvers>
<beans:bean class="com.redcollar.bl.commons.extension.JsonArgumentResolver" />
</mvc:argument-resolvers>
</mvc:annotation-driven>
二、接收非json数据
可以有多种方式
1、(@RequestParam(value=“aa”, required=true) String inputStr)