当前位置: 首页 > 知识库问答 >
问题:

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

谢阳曜
2023-03-14
    null
@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";
    }
}
public class MyMessage {
    private String id;
    // Getter/setter omitted for brevity
}
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

是否可以让Spring将JSON字符串转换为MyMessage的实例,或者我应该放弃,将其作为字符串读取并自己执行转换?

共有1个答案

凌蕴藉
2023-03-14

Spring使用反射调用@requestmapping方法。为了解析要传递给调用的每个参数,它使用HandlerMethodArgumentResolver的实现。对于@RequestParam带注释的参数,它使用RequestParamMethodArgumentResolver。此实现将请求参数绑定到单个对象,通常是string或某种number类型。

然而,您的用例更稀有一点。您很少接收json作为请求参数,这就是为什么我认为您应该重新考虑您的设计,但是如果您没有其他选择,您需要注册一个自定义的PropertyEditor,它将负责将请求参数的json值转换为您的自定义类型。

@controller类中的@initbinder注释方法中注册很简单

@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);
        }
    });
}
 类似资料:
  • 编辑:在这里发帖后发现了这篇文章,请看下面的回答 我正在使用服务栈及其OpenApi插件。我不确定这是否是一个摇摆用户界面问题,服务栈或我的代码中的某些东西。 我有一个 POST 终结点,我希望在其中填充“客户”属性: 客户类具有许多属性,如“名字”等。 当我在swagger-ui中查看时,我可以看到“示例值”缺少名称“客户”,而JSON对象“客户”应该放在这个名称中: 如果我按下“尝试一下”按钮

  • 现在我们要使用Spring-Data-JPA根据某个对象的ID查询它。所以我们这样做: 问题是,现在Spring Data JPA试图将ID类型的参数分配给查询,而查询当然需要。 在将参数插入查询之前,是否可以让Spring Data JPA将其转换为预期的类型(例如,通过注册Spring转换器)?或者,我们是否必须让该方法像下面这样接受一个字符串:

  • 问题内容: 我尝试使用JSON中的数据在AngularJS中创建动态表单。我有这个工作: HTML JS 这段代码有效,但是问题是 我不知道如何添加动态复选框或清单 以及如何在表单内部进行 验证 ,如下所示: .controller(’DynamicFormCtrl’,function($ scope){ 预先感谢您的关注。最好的祝福! 问题答案: 我已经解决了我的问题。 这是一个带有Angula

  • 问题内容: 我正在尝试将表单数据转换为对象,但我有这个线程,但是我不知道为什么它对我不起作用。我正在使用以下代码。 我尝试调试它,并注意到当我的函数运行时,它总是在else语句中运行代码。 问题答案: 我在JSFiddle中添加了以上表单,它将JSON数据显示为输出。 工作中的JSFiddle

  • 我必须以JSON格式转换数据表单以发送到webAPI。 我有一个从第1页调用的弹出表单: 第1页有以下代码: 输出JSON不正确。代码返回如下字符串: ! DOCTYPE html 什么是最好的方法来字符串化输入数据?我哪里错了?

  •  说明 调用方法: $.f2e.util.json2query(json); 函数说明: json转字符串参数 参数说明: 参数名 类型 说明 备注 json object json格式数据 无 脚本 <script> var a = {a:1,b:2,c:3} $.f2e.util.json2query(a) //输出:a=1&b=2&c=3 </script>