Как игнорировать свойство в одной сущности и не игнорировать в другой - JSON - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть 2 класса - 2 лица - Book и BookRentals.BookRentals принимает объект Book внутри.

Я хочу игнорировать один из атрибутов из Book внутри BookRentals.Это атрибут 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"
        }
    }
]

Как видите, доступный здесь не является необходимым, но я не могу сделать @JsonIgnore в классе Book, потому что эта переменная необходима для поиска всех книг:

[
    {
        "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 голосов
/ 18 декабря 2018

Вы можете использовать ResponseEntity и JsonSerializer (включить и исключить) Джексона, чтобы сделать то же самое.

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);
    }
0 голосов
/ 18 декабря 2018

Вы можете использовать Mixin , чтобы изменить поведение сериализации для класса.В вашем случае создайте миксин, который игнорирует свойство 'available':

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

Теперь вы можете включить миксин в ObjectMapper при сериализации BookRentals:

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

При сериализации одногоКниги, пропустите этот миксин, чтобы свойство 'available' снова было сериализовано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...