Как JSON вернуть детали дочернего объекта, используя JPA и Springboot - PullRequest
0 голосов
/ 04 ноября 2018

Я использую Springboot + JPA для создания полноценного бэкэнда, у меня есть две сущности, и мне нужно получить ответ JSON с деталями дочернего объекта, такими как:

{
  "mensagens": [
    {
        "id": "2",
        "origem_id": "1",
        "destino_id": "2",
        "assunto": "hello",
        "corpo": "hi, how are you?",
        "origem": {
            "id": "1",
            "nome_completo": "Leonard",
            "apelido": "leo"
        },
        "destino": {
            "id": "2",
            "nome_completo": "Mark",
            "apelido": "mark"
        }
    }
  ]
}

Кто-нибудь может мне помочь?

=============================================== ================================================== ================================================== ===

Мои занятия ниже:

Это мой контакт с организацией:

@Entity
@Table(schema="schema")
public class Contact {

@Id
@GeneratedValue
@Column(name = "contact_id")
private long id;

@Column(name = "nome_completo", nullable = true)
@JsonProperty(value = "nome_completo")
private String nomeCompleto;

@Column(name = "apelido", nullable = true)
private String apelido;

@OneToMany(mappedBy = "origemId", cascade = CascadeType.ALL)
private List<Message> msgOrigem;

@OneToMany(mappedBy = "destinoId", cascade = CascadeType.ALL)
private List<Message> msgDestino;

// getters and setters

Это мое сообщение от сущности

@Entity
@Table(name = "message", schema = "schema")
public class Message {
@Id
@GeneratedValue
@Column(name = "msg_id")
private long id;

@Column(name = "origem_id")
private long origemId;

@Column(name = "destino_id")
private long destinoId;

@Column(name = "assunto")
private String assunto;

@Column(name = "corpo")
private String corpo;

@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "contactId")
private Contact contact;

// getters and setters

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

@RestResource(exported = false)
public interface MessageRepository extends JpaRepository<Message, Long> {}

Сообщения моего класса:

public class Messages {

    private List<Message> mensagens;

    public List<Message> getMensagens() {
        return mensagens;
    }

    public void setMensagens(List<Message> mensagens) {
        this.mensagens = mensagens;
    }   
}

мой контроллер покоя:

@RestController 
@RequestMapping(path = "/sdm/mensageiro/mensagens") 
public class ListMessagesController { 
    @Autowired 
    private MessageRepository repository; 

    @GetMapping 
    public Messages findAllMessages() { 
          Messages c = new Messages(); 
          c.setMensagens(repository.findAll()); 
          return c; 
    } 
 }

Это класс, который запускает приложение springboot:

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

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

{
    "mensagens": [
        {
            "id": 2,
            "origemId": 1,
            "destinoId": 2,
            "assunto": "Hello",
            "corpo": "hi, how are you?"
        }
     ]
}

1 Ответ

0 голосов
/ 04 ноября 2018

Следует обновить тип выборки до EAGER, чтобы при получении списка сохранялось, вот что вам нужно обновить:

@OneToMany(mappedBy = "origemId", cascade = CascadeType.ALL, fetch=FetchType.EAGER)
private List<Message> msgOrigem;

@OneToMany(mappedBy = "destinoId", cascade = CascadeType.ALL, fetch=FetchType.EAGER)
private List<Message> msgDestino;

И игнорируйте контакт, чтобы не отображать контакт снова, потому что у вас будет рекурсивная ошибка.

@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "contactId")
@JsonIgnore
private Contact contact;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...