Icce___ 2019-09-24 16:25 采纳率: 66.7%
浏览 633
已采纳

springboot JPA保存报错

用户类

@Entity
@SecondaryTable(name="sys_user_extend")
@GenericGenerator(name = "jpa-uuid", strategy = "uuid")
public class SysUser implements UserDetails {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public SysUser() {
    }

    public SysUser(String loginName, String password) {
        super();
        this.loginName = loginName;
        this.password = password;
    }

    @Id
    @GeneratedValue(generator = "jpa-uuid")
    private String id;
    @Column(unique=true ,nullable = false)
    private String loginName;
    @Column(nullable = false)
    private String password;
    @Column(unique=true ,nullable = false)
    private String name;
    @Column(unique=true)
    private String email;
    @Column(unique=true)
    private String phone;
    @Column
    private String remark;
    @Column
    private String lastLoginTime;
    @Column(nullable = false)
    private String isActive = "true";
    @Column(table="sys_user_extend")
    private String level;
    @Column(table="sys_user_extend")
    private String currentExperience;
    @Column(table="sys_user_extend")
    private String totalExperience;
    @ManyToMany(cascade = { CascadeType.REFRESH }, fetch = FetchType.EAGER)
    private List<SysRole> roles;

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        List<GrantedAuthority> authorities = new ArrayList<>();
        List<SysRole> roles = this.getRoles();
        for (SysRole role : roles) {
            authorities.add(new SimpleGrantedAuthority(role.getName()));
        }
        return authorities;
    }

//省略get、set方法
}
public interface SysUserRepository extends JpaRepository<SysUser, Long> {
    SysUser findByLoginName(String loginname);

    SysUser findByPhone(String phone);

    SysUser findByEmail(String email);
}

controller层的添加方法

    //添加
    @ResponseBody
    @RequestMapping(value="/user",method=RequestMethod.POST)
    public Object post(@RequestBody SysUser user){
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        String encodedPassword  = passwordEncoder.encode(user.getPassword());
        user.setPassword(encodedPassword);
        userserivce.saveUser(user);
        return user;
    }

数据库用户表
数据库用户扩展信息表

报错信息:

org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: (was java.lang.NullPointerException); nested exception is com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: com.sakuraSmiles.alpha.security.model.SysUser[\"authorities\"])"

测试json

{"loginName":"test123","name":"测试","password":"123456","level":"5"}

项目使用了spring security,通过postman模拟请求,debug跟了下发现controller层的user是能拿到我传的对象的,但是里面也没有authorities字段。网上找了好久也没看到有跟我这个类似的,请问有人碰到过相似的问题吗?或者有大佬帮忙看一看吗?

感谢1楼和3楼大牛的解答帮助,十分感谢两位的帮助。分想要两位都给的,没办法只能选择一个采纳,就先给了1楼。问题已经解决了,定位到就是如3楼大牛所说,因为实现UserDetails 接口会有getAuthorities方法,在进行序列化时发现有带getXX开始的方法会自动去找XX的属性,
但是发现并没这个属性,所以报错。网上搜索了一下jpa有没有能够让系统能够忽视这个get方法的注释,在getAuthorities方法上面添加了@JsonIgnore就执行save不会报错了,目前没看出对于其他地方有没有影响。

    @Override
    @JsonIgnore
    public Collection<? extends GrantedAuthority> getAuthorities() {
        List<GrantedAuthority> authorities = new ArrayList<>();
        List<SysRole> roles = this.roles;
        for (SysRole role : roles) {
            authorities.add(new SimpleGrantedAuthority(role.getName()));
        }
        return authorities;
    }

图片说明

  • 写回答

3条回答

  • _鹿慕溪水 2019-09-24 16:30
    关注

    看一下你的user类有没有实现序列化接口

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥30 python代码,帮调试,帮帮忙吧