Spring отправляет пустой JSON, несмотря на то, что объект не нулевой - PullRequest
0 голосов
/ 16 февраля 2019

В моем контроллере у меня есть следующий метод:

    @RequestMapping(value = "/getAll", method = RequestMethod.GET)
    public List<Topic> getAllTopics() {

        List<Topic> allTopics = service.getAllTopics();

        assert allTopics.size() > 0; // is not empty
        System.out.println(allTopics.get(0)); // Topic{id=1, name='bla', description='blahhh'}

        return allTopics;
    }

Когда я перехожу к http://localhost:8080/getAll, я получаю [{},{},{},{}] в результате, но service.getAllTopics() возвращает непустой список. Итак, список для отправкине пустой, но браузер получает недопустимый JSON.Однако при сериализации объектов проблем не возникает, поскольку следующий метод возвращает допустимый JSON.В чем проблема?

    @GetMapping("/json")
    public List<Locale> getLocales() {
        return Arrays.asList(DateFormat.getAvailableLocales());
    }

Я использую последнюю версию Spring Boot, т.е. 2.1.3.RELEASE.

Обновление Вот мой класс сущности - Тема

@Entity
@Table(name = "topic", schema="tetra")
public class Topic {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private String description;

    public Topic() {
    }

    public Topic(String name, String description) {
        this.name = name;
        this.description = description;
    }

    @Override
    public String toString() {
        return "Topic{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", description='" + description + '\'' +
                '}';
    }
}

1 Ответ

0 голосов
/ 16 февраля 2019

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

Существует множество способов его настройки, например:

(1) Просто добавьте публичный геттер для всех полей

(2) Используйте @JsonAutoDetect(fieldVisibility = Visibility.ANY), чтобы частные полятакже может быть автоматически определено:

@Entity
@Table(name = "topic", schema="tetra")
@JsonAutoDetect(fieldVisibility = Visibility.ANY)
public class Topic {


}  

(3) Используйте @JsonProperty, чтобы явно выбрать, какие поля / получатель должны быть сериализованы. Приятная особенность этого подхода состоит в том, что имя поля в JSON может отличаться отPOJO:

@Entity
@Table(name = "topic", schema="tetra")
public class Topic {

   @JsonProperty("id")
   private Integer id;

   @JsonProperty("name")
   private String name;

   @JsonProperty("description")
   private String description;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...