1. 概述
在这个简短的教程中,我们将了解@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持久化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
注解将repeatedPassword
字段从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());
}
然而,**@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上找到:https://github.com/eugenp/tutorials/tree/master/jackson-modules/jackson-annotations。