在springmvc框架开发中,想要在方法中自动注入一些参数,该怎么做呢?
正好有这么个需求,在json请求过来的时候,想在Controller方法里自动获取json并转换为指定的Bean。
那么就需要用到HandlerMethodArgumentResolver类,这个类可以解析方法中的参数,那么我们可以在解析参数的时候做一些定制化工作。
首先定义一个StringToJsonResolver继承HandlerMethodArgumentResolver,那么需要实现supportsParameter()和resolveArgument()俩个方法,第一个方法是判定参数是否需要处理,需要处理则会调用resolveArgument()方法,resolveArgument()就是具体处理参数的地方。
@Component
public class StringToJsonResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
//包含AdapterJsonRequestBody注解的参数
return methodParameter.hasParameterAnnotation(AdapterJsonRequestBody.class);
}
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
if (!request.getContentType().contains("application/json")) {
return null;
}
BufferedReader reader = request.getReader();
StringBuilder stringBuilder = new StringBuilder();
char[] buf = new char[1024];
int rd;
while ((rd = reader.read(buf)) != -1) {
stringBuilder.append(buf, 0, rd);
}
JsonBody jsonBody = new JsonBody(stringBuilder.toString());
return jsonBody;
}
}
然后要注册这个resolver,需要定义一个WebConfiguration继承自WebMvcConfigurerAdapter类,然后把这个类注册到java container中
public class WebConfiguration extends WebMvcConfigurerAdapter{
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new StringToJsonResolver());
}
}
注解:
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface JsonRequestBody {
}
public class JsonBody {
private Map<String, String> params = new HashMap();
public String get(String key) {
return params.get(key);
}
}
这样在实际调用中就能使用这个@JsonRequestBody注解来获取想要的参数了
public class DemoController {
public Map<String, Object> index(@JsonRequestBody JsonBody jsonBody) {
}
}