【问题标题】:Bind json value to two object in spring MVC restful将json值绑定到spring MVC restful中的两个对象
【发布时间】:2016-12-21 18:36:35
【问题描述】:

目前我有一个 HTML 视图,用于输入个人详细信息和公司详细信息。我正在使用spring MVC框架restful。

我创建 json 并使用 Ajax 向 Restcontroller 发送请求。基于 URL 模式的创建方法称为 .e.g. json是

{"name":"rohit","address":"Pune","company":"ABC"}

这里上面的名字和地址属于person bean,company属于company bean。我希望 json 值绑定到它们各自的 bean。怎么做?我已经尝试了下面的代码,但我知道它不会工作。

@Requestmapping(value="/createperson",method=method.post)
public @Responsebody String createperson(@Requestbody person,@Requestbody company)
{

//Some code to save
}

我有一个表格,可以输入此人的详细信息和此人的公司详细信息。

我想要的是,当这个表单被提交时,它的一些字段绑定到 Person 对象属性,一些绑定到 Company 对象属性。如何才能做到这一点?以及如何对 json 值进行验证,如果有任何错误,如何将所有错误作为 json 响应再次发送回来。

【问题讨论】:

  • 能否请您提供错误验证的示例代码和解释。

标签: spring rest model-view-controller


【解决方案1】:

你只能有一个@RequestBody。然后 Spring 查看 content-type 标头并找到合适的 HttpMessageConverter,它将整个 http 实体主体(输入流)读入单个对象。

您所做的基本上是尝试将 Person 和 company 合并为一个 JSON 对象,从而使结构扁平化。如果你想让 spring 处理它,你需要创建一个具有相同(平面)层次结构的新对象。或者你需要创建一个包含 Person 和 Company 的包装类 PersonAndCompany,然后更改 JSON 以匹配结构,所以它看起来像这样。

{
    "person" : {
        "name":"rohit",
        "address":"Pune"
    },
    "company" : {
        "name":"ABC"
    }
}

【讨论】:

  • 好的,谢谢,如何再次发送所有验证错误。如何在控制器中执行验证。如何在响应 json 中绑定所有错误。
  • 您仍然可以像在其他任何地方一样使用 Valid 注释以及属性或类验证器。但是,如果您发送的 JSON 无法解析为预期的输入对象,您将获得 HttpMessageConversionException,您可以通过创建带有 ExceptionHandler 注释的方法在控制器中本地处理异常,或者使用 ControllerAdvice 在所有控制器中全局处理异常.
【解决方案2】:

如果你使用 Person 和 Company 之间的关系,你应该这样做,否则最好使用单个 bean 而不是两个。

@ResponseBody
    @RequestMapping(value = "/createperson",  method=RequestMethod.POST ,consumes=MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Person> createperson(@RequestBody Person person) {

        if(error found ){
            Person p new Person();
            p.setError(" error message ");
            return new ResponseEntity<Person>(p,HttpStatus.BAD_REQUEST);
        }
        return new ResponseEntity<Person>(person,HttpStatus.OK);

    }


    public class Person {
        private String name;
        private String address;
        Company company;
        String error;

        --- setters getters 
    }

    public class Company {
        String compName;
        --- setters getters 
    }

input json 
{"name":"person name ","address":"person address ","company":{"compName":"company name"}}

【讨论】:

    猜你喜欢
    • 2016-06-30
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    相关资源
    最近更新 更多