今天在使用fastjson时遇到一个诡异的问题,即对userDTO 对象进行一个json的转化却导致另一个entity User中getToken方法出现异常。
相关代码如下:
userDTO
public class UserDTO implements Serializable,DTO {
@NotBlank(message = "用户名为空")
private String name;
@NotBlank(message = "密码为空")
private String pass;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
@Override
public PO poIstance() {
return (PO) new User();
}
public PO getPoIstance() {
return (PO) new User();
}
public static void main(String[] args) {
UserDTO userDto =new UserDTO();
userDto.setName("tony");
userDto.setPass("123");
UserDTO userDto1 =new UserDTO();
userDto1.setName("tom");
userDto1.setPass("123");
UserDTO [] userDtos = new UserDTO[]{userDto,userDto1};
System.out.println(JSON.toJSONString(userDtos));
}
}
entity下的user
@Entity
@Component
public class User implements PO {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(unique = true)
private String name;
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
@Column
private String pass;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getToken() {
if (StringUtils.isEmpty(id)) {
throw new BussinessException(ResponseCode.ID_EMPTY);
}
String token = JWT.create().withAudience(String.valueOf(id)).sign(Algorithm.HMAC512(pass)).toString();
return token;
}
}
结果:
Exception in thread "main" 502 用户ID为空!
at com.Boyang.entity.User.getToken(User.java:55)
at com.alibaba.fastjson.serializer.ASMSerializer_2_User.write(Unknown Source)
原因:
fastjson生成的json中的字段除了field,如存在get开头的方法也会默认加进去;
经调试可以追踪到:

我们可以改写getPoIstance为
public PO getPoIstance() {
return new PO() {
};
}
由于此时不再执行new user(), 因此也不会再去获取getToken去获取poIstance中的token字段,因此,程序执行成功:
结果如下:
[{"name":"tony","pass":"123","poIstance":{}},{"name":"tom","pass":"123","poIstance":{}}]
网友评论