今天在使用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":{}}]