Spring 调用你的@RequestMapping
方法与反思。为了解析它将传递给调用的每个参数,它使用以下实现HandlerMethodArgumentResolver
. For @RequestParam
带注释的参数,它使用RequestParamMethodArgumentResolver
。此实现将请求参数绑定到单个对象,通常是String
或一些Number
type.
但是,您的用例比较罕见。你很少收到json
作为请求参数,这就是为什么我认为你应该重新考虑你的设计,但如果你别无选择,你需要注册一个自定义PropertyEditor
这将负责转换请求参数的json
值到您的自定义类型。
注册很简单@InitBinder
你的注释方法@Controller
class
@InitBinder
public void initBinder(WebDataBinder dataBinder) {
dataBinder.registerCustomEditor(MyMessage.class, new PropertyEditorSupport() {
Object value;
@Override
public Object getValue() {
return value;
}
@Override
public void setAsText(String text) throws IllegalArgumentException {
value = new Gson().fromJson((String) text, MyMessage.class);
}
});
}
在这种特殊情况下,我们不需要所有的方法PropertyEditor
接口,所以我们可以使用PropertyEditorSupport
这是一个有用的默认实现PropertyEditor
。我们只需使用我们想要的 JSON 解析器来实现我们关心的两个方法。我用了Gson
因为它是可用的。
当Spring发现有你请求的请求参数时,它会检查参数类型,找到类型MyMessage
并寻找已注册的PropertyEditor
对于那种类型。它会找到它,因为我们注册了它,然后它会使用它来转换值。
您可能需要实现其他方法PropertyEditor
取决于你接下来要做什么。
我的建议是永远不要将 JSON 作为请求参数发送。将您的请求内容类型设置为application/json
并发送json
作为请求的正文。然后使用@RequestBody
来解析它。