【问题标题】:How to ignore property in one Entity and not to ignore in another - JSON如何忽略一个实体中的属性而不忽略另一个实体 - JSON
【发布时间】:2019-05-18 15:47:30
【问题描述】:

我有 2 个类 - 2 个实体 - Book 和 BookRentals。 BookRentals 将 Book 对象放入其中。

我想忽略 BookRentals 中 Book 的属性之一。这是available 属性。 我有一种方法可以负责查找所有租金。 JSON 格式的输出如下所示:

[
    {
        "id": 1,
        "book": {
            "id": 1,
            "title": "Krzyżacy",
            "author": "Henryk Sienkiewicz",
            "category": "powieść historyczna",
            "available": false
        },
        "user": {
            "id": 2,
            "name": "piotri",
            "password": "123"
        }
    }
]

如您所见,这里不需要可用,但我不能在 Book 类中创建 @JsonIgnore,因为在查找所有书籍时需要此变量:

[
    {
        "id": 1,
        "title": "Krzyżacy",
        "author": "Henryk Sienkiewicz",
        "category": "powieść historyczna",
        "available": false
    }
]

书籍类:

package bookrental.model.book;

import lombok.*;

import javax.persistence.*;
import javax.validation.constraints.NotNull;

@Entity
@Getter
@Setter
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @NotNull
    private String title;
    @NotNull
    private String author;
    @NotNull
    private String category;
    private boolean available;

    public Book(String title, String author, String category, boolean available) {
        this.title = title;
        this.author = author;
        this.category = category;
        this.available = available;
    }
}

图书租赁类

package bookrental.model.book;

import bookrental.model.account.User;
import lombok.*;

import javax.persistence.*;

@Entity
@Getter
@Setter
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor

public class BookRentals {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @OneToOne
    private Book book;
    @OneToOne
    private User user;

    public BookRentals(Book book, User user) {
        this.book = book;
        this.user = user;
    }
}

我该怎么做?

【问题讨论】:

标签: java json spring spring-mvc spring-boot


【解决方案1】:

您可以使用 ResponseEntity 和 JsonSerializer(包括和排除)jackson 来做同样的事情。

return new JSONSerializer().transform(new DateTransformer("MM/dd/yyyy HH:mm:ss"), java.util.Date.class).include("field1").exclude("field2").serialize(pojoObject);

然后从控制器返回响应,如下所示。

return new ResponseEntity<String>(new JSONSerializer().transform(new DateTransformer("MM/dd/yyyy HH:mm:ss"), java.util.Date.class).include("field1").exclude("field2").serialize(pojoObject), headers,HttpStatus.OK);

您的控制器方法如下所示。

@RequestMapping(value = "/getUser", method = RequestMethod.GET,produces="application/json")
    @ResponseBody
    public ResponseEntity<String> getUser(@RequestParam(value = "userId", required = true) String userId)
    {

        User user = userService.findByUserId(userId);
        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Type", "application/json; charset=utf-8");
        return new ResponseEntity<String>(new JSONSerializer().transform(new DateTransformer("MM/dd/yyyy HH:mm:ss"), java.util.Date.class).include("field1").exclude("field2").serialize(user), headers,HttpStatus.OK);
    }

【讨论】:

  • 这里为什么需要日期?我正在使用spring boot,所以@ResponseBody,我认为标题也不是必需的。所以我的 Service 方法应该是这样的:pastebin.com/tPUQe4DT ?我无法解析 JSONSerializer 和 DateTransfomer 的符号。
  • 日期转换用于操作日期模式..如果您不想使用可以将其删除。如果您不使用 Restcontroller,则需要 @ResponseBody。对于 JSONSerializer,您应该从 import flexjson.JSONSerializer 导入它;并确保你有 net.sf.flexjsonflexjson2.1 in pom.xml
  • 嘿,一切正常,但我无法摆脱 JSON 中的类属性。看起来是这样的:pastebin.com/3xSBgmiw 我应该如何排除它?在 pastebin 我也粘贴方法。
  • 排除(“*.class”)
【解决方案2】:

您可以使用 Mixin 来更改类的序列化行为。 在您的情况下,创建一个忽略“可用”属性的混合:

public interface RentalBookMixin {
    @JsonIgnore
    boolean isAvailable();
}

现在您可以在序列化 BookRentals 时在 ObjectMapper 上启用 mixin:

 ObjectMapper mapper = new ObjectMapper();
 mapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector());
 mapper.addMixInAnnotations(Book.class, RentalBookMixin.class);

当序列化单个 Books 时,省略这个 mixin,这样 'available' 属性会再次被序列化。

【讨论】:

  • 好吧,我应该创建接口,哪个类实现它?这是接口应该包含的唯一方法吗?我应该在哪里添加ObjectMapper,在哪个类中?
  • 该接口没有被任何人实现——它只是作为 JSON 属性配置的主要来源为 Jackson 服务,覆盖您的 Book 类中的那些。 ObjectMapper 配置取决于您使用的框架(JEE、Spring、...),通常会提供默认的 ObjectMapper,它可以被覆盖。
  • 不幸的是,不能成功:(我不知道在哪里写什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-11
  • 2011-12-21
  • 1970-01-01
  • 2014-03-29
  • 2022-01-04
  • 1970-01-01
相关资源
最近更新 更多