在Spring MVC 4.0中自动转换JSON表单参数

我正在尝试构建一个Spring MVC控制器,该控制器将接收带有JSON格式参数的POSTed表单,并让Spring自动将其转换为Java对象。

  • 请求内容类型为 application/x-www-form-urlencoded
  • 包含JSON字符串的参数名称为 data.json

这是控制器:

@Controller

public 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类中使用带注释的方法注册很简单

@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根据下一步执行其他方法。

以上是 在Spring MVC 4.0中自动转换JSON表单参数 的全部内容, 来源链接: utcz.com/qa/402754.html

回到顶部