在Spring MVC 4.0中自动转换JSON表单参数
我正在尝试构建一个Spring MVC控制器,该控制器将接收带有JSON格式参数的POSTed表单,并让Spring自动将其转换为Java对象。
- 请求内容类型为
application/x-www-form-urlencoded
- 包含JSON字符串的参数名称为
data.json
这是控制器:
@Controllerpublic class MyController {
@RequestMapping(value = "/formHandler", method = RequestMethod.POST)
public @ResponseBody String handleSubscription(
@RequestParam("data.json") MyMessage msg) {
logger.debug("id: " + msg.getId());
return "OK";
}
}
这就是MyMessage对象的样子:
public class MyMessage { private String id;
// Getter/setter omitted for brevity
}
可能并不奇怪,发布带有参数data.json = {“ id”:“ Hello”}的表单会导致HTTP错误500,但会出现以下异常:
org.springframework.beans.ConversionNotSupportedException: Failed to convert value of type 'java.lang.String' to required type 'MyMessage'
nested exception is java.lang.IllegalStateException:
Cannot convert value of type [java.lang.String] to required type [MyMessage]: no matching editors or conversion strategy found
如果我正确阅读了MappingJackson2HttpMessageConverter文档,那么Jackson-
JSON转换将由Content-Type触发,application/json
因为这是POST形式,所以我显然不能使用它(并且我不控制POSTing)。
是否可以让Spring将JSON字符串转换为MyMessage的实例,还是我应该放弃,将其作为String读取并自己执行转换?
回答:
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
根据下一步执行其他方法。
以上是 在Spring MVC 4.0中自动转换JSON表单参数 的全部内容, 来源链接: utcz.com/qa/402754.html