Java 将对象序列化为Json时出现NullPointerException
我有一个类型为Java 将对象序列化为Json时出现NullPointerException,java,json,serialization,jackson,Java,Json,Serialization,Jackson,我有一个类型为User(定义如下)的对象,它在序列化为Json时抛出此特定错误: com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: com.providenceuniversal.gim.AuthenticationRequest["user"]->com.providenceuniversal.gim.Use
User
(定义如下)的对象,它在序列化为Json时抛出此特定错误:
com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: com.providenceuniversal.gim.AuthenticationRequest["user"]->com.providenceuniversal.gim.User["lastSeenToLocal"])
用户
定义(具有相关属性和方法):
从异常中可以明显看出,问题是由
getLastSeentLocal()
方法引起的(该方法试图操作lastSeen
中的null
对象),其与序列化过程的相关性我看不到。Jackson是否默认调用所有getter,无论它们返回的字段是否列为JsonProperty
s,或者是否缺少某些内容(很明显)?Jackson默认使用类的getter()。
所以你可以
- 使用@jsonautodect来使用字段
- 将@JsonIgnore添加到getLastSeentLocal()方法
- 改进getLastSeentLocal()以检查相关字段不为null(或任何其他条件)
public class User implements ServerMessage {
//.....
private final @JsonInclude(Include.NON_NULL) Instant lastSeen;
@JsonCreator
User(@JsonProperty("username") String username) {
if (!isValidUsername(username))
throw new IllegalArgumentException("Invalid constructor argument values");
this.username = username.trim();
this.firstName = null;
this.lastName = null;
this.email = null;
this.status = null;
this.joinDate = null;
this.lastSeen = null;
this.dateOfBirth = null;
}
@JsonCreator
User(
@JsonProperty("username") String username,
@JsonProperty("firstName") String firstName,
@JsonProperty("lastName") String lastName,
@JsonProperty("email") String email,
@JsonProperty("status") String status,
@JsonProperty("joinDate") Instant joinDate,
@JsonProperty("lastSeen") Instant lastSeen,
@JsonProperty("dateOfBirth") LocalDate dateOfBirth) {
if (username == null || username.trim().length() == 0)
throw new IllegalArgumentException("Invalid constructor argument values");
this.username = username.trim();
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
this.status = status;
this.joinDate = joinDate;
this.lastSeen = lastSeen;
this.dateOfBirth = dateOfBirth;
}
//.....
public Instant getLastSeen() {
return lastSeen;
}
public LocalDateTime getLastSeenToLocal() {
return getLastSeen().atZone(ZoneId.systemDefault()).toLocalDateTime();
}