1. 概述
在本簡短教程中,我們將學習 @JsonIgnore 和 @Transient 註解之間的區別。
2. <em @JsonIgnore
我們使用 註解來指定應在序列化和反序列化過程中忽略的方法或字段。
此標記註解屬於 Jackson 庫。
我們通常將此註解應用於可能不相關或可能包含敏感信息的字段。我們將其應用於字段或方法,以標記我們希望忽略的屬性。
首先,讓我們創建一個簡單的 Person 類,其中包含幾個字段:
class Person implements Serializable {
private Long id;
private String firstName;
private String lastName;
// getters and setters
}現在,假設我們不想在 JSON 表示的 Person 對象中顯示 id 字段。讓我們使用 @JsonIgnore 註解來排除該字段:
class Person implements Serializable {
@JsonIgnore
private Long id;
private String firstName;
private String lastName;
// getters and setters
}最後,我們編寫一個測試,以確保 ObjectMapper 忽略 id 字段:
@Test
void givenPerson_whenSerializing_thenIdFieldIgnored()
throws JsonProcessingException {
Person person = new Person(1L, "My First Name", "My Last Name");
String result = new ObjectMapper().writeValueAsString(person);
assertThat(result, containsString("firstName"));
assertThat(result, containsString("lastName"));
assertThat(result, not(containsString("id")));
}3. <em @Transient>
另一方面,我們使用 > 註解來指示 Java 持久性 API (JPA) 在將對象映射到數據庫時應忽略該字段。 當我們用此註解標記一個字段時,JPA 不會持久化該字段,也不會從數據庫中檢索其值。
現在,讓我們創建一個 User 類:
@Entity
@Table(name = "Users")
class User implements Serializable {
@Id
private Long id;
private String username;
private String password;
private String repeatedPassword;
// getters and setters
}讓我們從數據庫中移除 repeatedPassword 字段,該字段帶有 @Transient 註解,用於 User 對象表示中。
@Entity
@Table(name = "User")
class User implements Serializable {
@Id
private Long id;
private String username;
private String password;
@Transient
private String repeatedPassword;
// getters and setters
}當我們將 User 對象持久化到數據庫時,JPA 不會將 repeatedPassword 值保存到數據庫中。此外,JPA 在從數據庫加載對象時會忽略該字段:
@Test
void givenUser_whenSave_thenSkipTransientFields() {
User user = new User(1L, "user", "newPassword123", "newPassword123");
User savedUser = userRepository.save(user);
assertNotNull(savedUser);
assertNotNull(savedUser.getPassword());
assertNull(savedUser.getRepeatedPassword());
}然而,<em data-annotation="Transient"></em> 註解並不會排除字段從序列化中排除:
@Test
void givenUser_whenSerializing_thenTransientFieldNotIgnored() throws JsonProcessingException {
User user = new User(1L, "user", "newPassword123", "newPassword123");
String result = new ObjectMapper().writeValueAsString(user);
assertThat(result, containsString("user"));
assertThat(result, containsString("repeatedPassword"));
}4. 結論
在本文中,我們學習了 <em @JsonIgnore</em> 和 <em @Transient</em> 註解之間的區別。
總結一下,這兩個註解都用於指示在執行某些操作時應忽略的字段。<em @JsonIgnore</em> 註解將字段從 JSON 表示中排除,而 <em @Transient</em> 註解則從數據庫表示中省略它們。