@JsonIgnore 與@Transient
瀏覽人數:940最近更新:
一、概述
在這個簡短的教程中,我們將了解@JsonIgnore
和@Transient
註釋之間的區別。
2. @JsonIgnore
我們使用@JsonIgnore
註解來指定在序列化和反序列化過程中應該忽略的方法或字段。此標記註釋屬於 Jackson 庫。
我們經常應用此註釋來排除可能不相關或可能包含敏感信息的字段。我們在字段或方法上使用它來標記我們想要忽略的屬性。
首先,讓我們創建一個包含多個字段的簡單Person
類:
class Person implements Serializable {
private Long id;
private String firstName;
private String lastName;
// getters and setters
}
現在,假設我們不想在Person
對象的 JSON 表示中顯示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. @Transient
另一方面,我們使用@Transient
註釋來指示 Java Persistence 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
}
讓我們從帶有@Transient
註釋的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());
}
但是, @Transient
註釋不會從序列化中排除字段:
@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
註釋從數據庫表示中省略了它們。
一如既往,本文的完整源代碼可在 GitHub 上獲得。
本作品係原創或者翻譯,採用《署名-非商業性使用-禁止演繹4.0國際》許可協議