fastonjson中遇到的問題

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 設計模式分類 總體來說設計模式分為三大類:創建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原...
    lifeline丿毅閱讀 1,254評論 0 2
  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,504評論 0 13
  • 本文包括:1、Listener簡介2、Servlet監聽器3、監聽三個域對象創建和銷毀的事件監聽器4、監聽三個域對...
    廖少少閱讀 6,119評論 6 28
  • org.springframework.beans: org.springframework.beans.fact...
    過河卒sc閱讀 602評論 1 1
  • 一般人還真不知道,太極拳十大好處! 2016-02-22奧琦瑋太級社團 太極拳是流派性武功,除了具備武術的共性特征...
    心靈約定閱讀 486評論 0 0