如何忽略一个实体中的属性,而不忽略另一个实体中的属性-JSON

时间:2018-12-18 08:56:59

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

我有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;
    }
}

BookRentals类

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;
    }
}

我应该怎么做?

2 个答案:

答案 0 :(得分:0)

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

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

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

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

序列化单个Book时,请忽略此混合,以便再次对“ available”属性进行序列化。

答案 1 :(得分:0)

您可以使用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);
    }