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 C# P/Invoke的效率问题
  • ¥20 thinkphp适配人大金仓问题
  • ¥20 Oracle替换.dbf文件后无法连接,如何解决?(相关搜索:数据库|死循环)
  • ¥15 数据库数据成问号了,前台查询正常,数据库查询是?号
  • ¥15 算法使用了tf-idf,用手肘图确定k值确定不了,第四轮廓系数又太小才有0.006088746097507285,如何解决?(相关搜索:数据处理)
  • ¥15 彩灯控制电路,会的加我QQ1482956179
  • ¥200 相机拍直接转存到电脑上 立拍立穿无线局域网传
  • ¥15 (关键词-电路设计)
  • ¥15 如何解决MIPS计算是否溢出
  • ¥15 vue中我代理了iframe,iframe却走的是路由,没有显示该显示的网站,这个该如何处理