Spring
@RequestMapping通过反射调用您的方法。为了解决传递给调用的每个参数,它使用的实现
HandlerMethodArgumentResolver。对于带
@RequestParam注释的参数,它使用
RequestParamMethodArgumentResolver。此实现将请求参数绑定到单个对象,通常是a
String或某种
Number类型。
但是,您的用例很少见。您很少收到
json请求参数, 这就是为什么我认为您应该重新考虑设计的原因
,但是如果您别无选择,则需要注册一个自定义项
PropertyEditor,以将请求参数的
json值转换为自定义类型。
@InitBinder在您的
@Controller类中使用带注释的方法注册很简单
@InitBinderpublic 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
解析它。



