您的位置:首页 > 编程语言 > Java开发

SpringMVC HandlerMethodArgumentResolver解读

2017-09-09 13:36 441 查看
HandlerMethodArgumentResolver:将请求报文绑定到处理方法形参的策略接口

/**
* 策略模式接口:用于在给定的请求的上下文中将方法参数解析为参数值
*/
public interface HandlerMethodArgumentResolver {

/**
* 该处理程序是否支持给定的方法参数类型(只有返回true才回去调用 resolveArgument)
*/
boolean supportsParameter(MethodParameter parameter);

/**
* 将方法参数从给定的请求中解析为参数值
*
*/
Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception;

}


我们也可以实现自己的HandlerMethodArgumentResolver:

package cn.bjut.entity;

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.util.Arrays;

public class MyHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
System.out.println(parameter.getMethod());
System.out.println(parameter.getParameterType());
System.out.println(Arrays.toString(parameter.getMethodAnnotations()));
return parameter.getParameterType().equals(Person.class);
}

@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
mavContainer.setRequestHandled(true);

String name = webRequest.getParameter("name");
Integer age = Integer.parseInt(webRequest.getParameter("age"));

return new Person(name, age);
}
}


Controller

@ResponseBody
@RequestMapping(value = "/demo2", method = RequestMethod.GET)
public String getPerson(Person person) {
return person.toString();
}


在SpringMVC添加如下配置:

<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="cn.bjut.entity.MyHandlerMethodArgumentResolver"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>


测试:

F:\>curl "http://localhost:8080/SpringMVCDemo/demo2?name=lgh&age=25"
Person{name='lgh', age=25}


我们也可以是使用
HandlerMethodReturnValueHandler
来完成JSON到JavaBean的转换。

package cn.bjut.entity;

import com.fasterxml.jackson.databind.ObjectMapper;
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 javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;

public class MyHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.getParameterType().equals(Person.class);
}

@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
mavContainer.setRequestHandled(true);

HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
ServletInputStream inputStream = request.getInputStream();

byte[] buffer = new byte[inputStream.available()];
inputStream.read(buffer);

String str = new String(buffer, "UTF-8");

ObjectMapper objectMapper = new ObjectMapper();
Person person = objectMapper.readValue(str, Person.class);

inputStream.close();

return person;
}
}


@ResponseBody
@RequestMapping(value = "/demo2", method = RequestMethod.POST, consumes = "application/json;charset=UTF-8")
public String getPerson(Person person) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.writeValueAsString(person);
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: