Как удалить нулевые атрибуты при построении ответа JSON - PullRequest
1 голос
/ 19 апреля 2020

Итак, я создаю простой API в Spring Boot, который извлекает определенные c книги и их авторы образуют базу данных. Книга имеет идентификатор, имя, год публикации и внешний ключ для автора этой книги. Вот модель:

@Entity
@Table(name="book", schema = "book_store")
public class Book {

    @Id
    private long id;
    private String name;
    private int released;
    @ManyToOne
    @JoinColumn(name="author_id")
    private Author author;

    public Book() {
    }

    public Book(String name, int released, Author author){
        this.name=name;
        this.released=released;
        this.author=author;
    }

    //And also the getters and setters

Вот репозиторий:

public interface BookRepository extends JpaRepository<Book, Long> {

}

И реализация службы:

@Service
public class BookServiceImplementation implements BookService {

    @Autowired
    private BookRepository bookRepository;

    public List<Book> getAll(){
        return bookRepository.findAll();
    }

    public List<Book> getWithoutAuthor(){
        List<Book> newList=bookRepository.findAll();
        newList.forEach(p ->p.setAuthor(null));
        return newList;
    }
}

Так что когда я go к /api/book/noAuthor он вызывает метод getWithoutAuthor() и возвращает ответ JSON:

[{"id":1,"name":"Anna Karenina","released":1877,"author":null},
{"id":2,"name":"War And Peace","released":1869,"author":null},
{"id":3,"name":"To Kill A Mockingbird","released":1960,"author":null},
{"id":4,"name":"Go Set A Watchman","released":2015,"author":null},
{"id":5,"name":"The Catcher In The Rye","released":1951,"author":null},
{"id":6,"name":"Franny And Zooey","released":1961,"author":null}]

Автору присваивается значение null, чего я и хочу, однако есть способ сделать ответ невозвратным "author":null вообще?

Потому что в этом случае поле «автор» в значительной степени бесполезно, и я хочу полностью его удалить, потому что хочу получить более чистый ответ.

Я также пытался создайте пользовательский ответ JSON, создав список карт с ключами и значениями. Несмотря на то, что метод работает, он не возвращает список книг, который я хочу, чтобы контроллер возвращал в конце.

Кто-нибудь знает другой метод?

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

В этом случае я обычно, как вы говорите, возвращаете в контроллер список пользовательских объектов, которые будут книгами без автора. Это самый простой способ, уровень контроллера отвечает за анализ ответа.

Я добавлю сумасшедшую идею просто для удовольствия:

в хранилище

@Query("select id,name,released from Book") // you get all except the author
List<Book> findBooksWithoutAuthor();
1 голос
/ 19 апреля 2020

Вы можете просто добавить аннотацию @JsonInclude, а затем включить ненулевые значения.

@JsonInclude(JsonInclude.Include.NON_NULL)
@ManyToOne
@JoinColumn(name="author_id")
private Author author; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...