开发相关

fastonjson中遇到的问题

2019-07-24  本文已影响0人  我是光芒万丈

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

上一篇 下一篇

猜你喜欢

热点阅读