1. 概述
在本簡短教程中,我們將學習 @JsonIgnore 和 @Transient 註解之間的區別。
2.
我們使用 註解來指定在序列化和反序列化過程中應被忽略的方法或字段。此標記註解屬於 Jackson 庫。
我們通常將此註解應用於可能不相關或可能包含敏感信息的字段。我們使用它來標記我們希望忽略的屬性,無論是字段還是方法。
首先,讓我們創建一個簡單的 類,其中包含幾個字段:
class Person implements Serializable {
private Long id;
private String firstName;
private String lastName;
// getters and setters
}
現在,假設我們不想在 對象的 JSON 表示中顯示 字段。讓我們使用 註解來排除該字段:
class Person implements Serializable {
@JsonIgnore
private Long id;
private String firstName;
private String lastName;
// getters and setters
}
最後,讓我們編寫一個測試以確保 忽略 字段:
@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.
另一方面,我們使用 註解來指示 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
}
讓我們使用 註解從數據庫表示的 User 對象中排除 repeatedPassword 字段:
@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());
}
然而, 註解不會排除字段在序列化中的出現:
@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. 結論
在本文中,我們學習了 @JsonIgnore 和 @Transient 註解之間的區別。
總而言之,這兩個註解都用於指示在執行某些操作時應忽略的字段。@JsonIgnore 註解從 JSON 表示中排除這些字段。@Transient 註解則從數據庫表示中省略它們。