java - 使用 Jackson 注释将对象序列化为 XML

标签 java spring hibernate jackson

我使用 Spring 和 Jackson 来序列化对象,然后将它们作为 API 的一部分作为 XML 返回。 Jackson 文档概述了返回的根元素名称应与对象的类名称相匹配。

我有以下模型。我已明确将根元素设置为等于“product”。

package example.models;

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.Data;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import javax.persistence.*;
import java.util.Date;

@Data
@Entity
@Table(name = "products")
@JacksonXmlRootElement(localName = "product")
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @CreationTimestamp
    private Date createdAt;

    @UpdateTimestamp
    private Date updatedAt;
}

在我的 Controller 中,我返回包含检索到的产品列表的响应。

package example.controllers;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Optional;

@RestController
@RequestMapping("/api/products")
@RequiredArgsConstructor
public class ProductController {
    private final ProductRepository productRepository;

    @GetMapping(path = "/{id}", produces = {"application/json", "application/xml"})
    public ResponseEntity<Optional<Product>> getProduct(@PathVariable Long id) {
        return ResponseEntity.ok(this.productRepository.findById(id));
    }
}

当我到达端点时,/api/products/1 我得到:

<Optional>
    <id>1</id>
    <name>Example</name>
    <createdAt>2019-12-18T12:44:12.536+0000</createdAt>
    <updatedAt>2019-12-18T12:44:12.536+0000</updatedAt>
</Optional>

虽然,我期待:

<product>
    <id>1</id>
    <name>Example</name>
    <createdAt>2019-12-18T12:44:12.536+0000</createdAt>
    <updatedAt>2019-12-18T12:44:12.536+0000</updatedAt>
</product>

我如何使用 Jackson/jackson-dataformat-xml 来实现此目的,因为我的注释看起来没有效果?

最佳答案

更改端点以返回Product而不是Optional

@GetMapping(path = "/{id}", produces = {"application/json", "application/xml"})
public ResponseEntity<Product> getProduct(@PathVariable Long id) {
    return ResponseEntity.ok(this.productRepository.findById(id).get());
}

注意:为了简单起见,此处使用Optional.get()。没有 Product 的情况应使用 Optional 方法(如 isPresent()orElse())正确处理。

关于java - 使用 Jackson 注释将对象序列化为 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59396295/

相关文章:

hibernate - Spring MVC Hibernate + SQLite 不创建数据库

java - 构造函数 String(int, int, char[]) 在哪里定义的?

java - 如何在Java中正确实现MVC模式?

java - 如何在不同的类中使用 Spring Bean

java - Hibernate 数据源连接未关闭

java - 是否有可能以及如何在 Spring 进行辅助注入(inject)?

java - 没有 Spring,Hibernate 有意义吗?

java - Hibernate - 如何急切地加载惰性字段?

java - Spring 验证异常 : BindException

java - DatagramChannel Server 一个未连接的 channel 和多个已连接的 channel