为什么我们需要杰克逊数据绑定?

Why do we need jackson databind?

我是 JAVA EE 的新手。我的问题是,为什么我们需要杰克逊数据绑定?因为我们可以通过 @ModelAttribute 接收 Request Params 并通过 @RequestBody 通过 http PUT 或 POST 请求。我找不到我们需要 jackson databind 将 json/xml 转换为 POJO 或相反的原因。

谢谢。

Why do we need jackson databind?

因为使用 XML(或 JSON)表示结构化数据比使用简单的名称-值对更容易。

因为做AJAX.

的时候从客户端发送和接收JSON更方便

因为一旦你要在服务端Java应用中处理发送和接收JSON或XML,将结构化数据作为POJO来处理会更方便。

None以上几点意味着你必须使用绑定。还有其他方法可以处理上述各项。但是许多 Java 开发人员认为数据绑定是更好的方法:在开发时间方面更高效,也更可靠。尤其是当您使用复杂的 API 实现服务时。这就是它们受欢迎的原因。


正如其他 answers/comments 指出的那样,如果您正在使用 @RequestBody,那么这就是在幕后使用绑定库来为您提供 POJO。在 Spring 的情况下,使用的是 Jackson。

默认情况下,当端点需要 JSON 文档作为输入并且给定的控制器方法参数直接用 @RequestBody, Spring will use Jackson databind features to map the incoming JSON document to a Java object. You don't need to use the Jackson's ObjectMapper 注释时,就像 Spring 为您做的那样。

出于示例目的,请考虑以下创建评论的 HTTP 请求:

POST /comments HTTP/1.1
Host: example.org
Content-Type: application/json

{
  "content": "Lorem ipsum"
}

和下面的 class 代表一条评论:

@Data
public class Comment {
    private String content;
}

A @RestController 来处理这样的请求就像:

@RestController
@RequestMapping("/comments")
public class CommentController {

    @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Foo> createComment(@RequestBody Comment comment) {

        // By default, Spring will rely on Jackson databind to map the incoming 
        // JSON document to the comment argument annotated with @RequestBody

        ...
    }
}

如果您对将传入 JSON 文档映射到 Java 对象的 Spring 组件感兴趣,请查看 MappingJackson2HttpMessageConverter class:

Implementation of HttpMessageConverter that can read and write JSON using Jackson 2.x's ObjectMapper.

This converter can be used to bind to typed beans, or untyped HashMap instances.

By default, this converter supports application/json and application/*+json with UTF-8 character set. [...]


如果您正在创建一个 HTTP API 并公开可以使用 JSON 表示操作的资源,您不太可能使用 @ModelAtribute。当您处理网络视图时,此类注释特别有用。

当您收到某些数据类型的请求时,例如 json/xml,Java EE 平台将尝试在项目的某些模型对象中反序列化此请求属性。

但是平台本身不提供开箱即用的反序列化实现。因此它将尝试在 class 路径中使用一些反序列化器提供程序,如 jackson、jersey、gson 等。

如您所说 - 可以使用 @ModelAttribute - 但此注释是前端表单视图请求的更好选择。在其余 json/xml 请求的情况下,@ModelAttribute 将无法将接收到的数据正确转换为程序的业务 class。