zoukankan      html  css  js  c++  java
  • MyBatis Generator插件之SerializablePlugin

    在实现RememberMe时遇到如下错误

    2019-06-24 15:37:49.620 WARN 12952 --- [nio-8088-exec-2] o.a.shiro.mgt.DefaultSecurityManager : Delegate RememberMeManager instance of type [org.apache.shiro.web.mgt.CookieRememberMeManager] threw an exception during onSuccessfulLogin. RememberMe services will not be performed for account [com.sfn.bms.system.model.User@86fc436].

    org.apache.shiro.io.SerializationException: Unable to serialize object [com.sfn.bms.system.model.User@86fc436]. In order for the DefaultSerializer to serialize this object, the [org.apache.shiro.subject.SimplePrincipalCollection] class must implement java.io.Serializable.

    查找了下原因,原来使用Generator生成的User是没有序列化的

    package com.sfn.bms.system.model;
    
    import javax.persistence.*;
    
    public class User {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Short id;
    
        /**
         * 账号
         */
        private String account;
    
        /**
         * 密码
         */
        private String password;
    
        /**
         * 邮箱
         */
        private String email;
    
        /**
         * 状态 1-正常,0-禁用,-1-删除
         */
        private Boolean status;
    
        /**
         * 添加时间
         */
        @Column(name = "create_time")
        private Integer createTime;
    
        /**
         * 上次登陆时间
         */
        @Column(name = "last_login_time")
        private Integer lastLoginTime;
    
        /**
         * 上次登录IP
         */
        @Column(name = "last_login_ip")
        private String lastLoginIp;
    
        /**
         * 登陆次数
         */
        @Column(name = "login_count")
        private Integer loginCount;
    
        /**
         * @return id
         */
        public Short getId() {
            return id;
        }
    
        /**
         * @param id
         */
        public void setId(Short id) {
            this.id = id;
        }
    
        /**
         * 获取账号
         *
         * @return account - 账号
         */
        public String getAccount() {
            return account;
        }
    
        /**
         * 设置账号
         *
         * @param account 账号
         */
        public void setAccount(String account) {
            this.account = account == null ? null : account.trim();
        }
    
        /**
         * 获取密码
         *
         * @return password - 密码
         */
        public String getPassword() {
            return password;
        }
    
        /**
         * 设置密码
         *
         * @param password 密码
         */
        public void setPassword(String password) {
            this.password = password == null ? null : password.trim();
        }
    
        /**
         * 获取邮箱
         *
         * @return email - 邮箱
         */
        public String getEmail() {
            return email;
        }
    
        /**
         * 设置邮箱
         *
         * @param email 邮箱
         */
        public void setEmail(String email) {
            this.email = email == null ? null : email.trim();
        }
    
        /**
         * 获取状态 1-正常,0-禁用,-1-删除
         *
         * @return status - 状态 1-正常,0-禁用,-1-删除
         */
        public Boolean getStatus() {
            return status;
        }
    
        /**
         * 设置状态 1-正常,0-禁用,-1-删除
         *
         * @param status 状态 1-正常,0-禁用,-1-删除
         */
        public void setStatus(Boolean status) {
            this.status = status;
        }
    
        /**
         * 获取添加时间
         *
         * @return create_time - 添加时间
         */
        public Integer getCreateTime() {
            return createTime;
        }
    
        /**
         * 设置添加时间
         *
         * @param createTime 添加时间
         */
        public void setCreateTime(Integer createTime) {
            this.createTime = createTime;
        }
    
        /**
         * 获取上次登陆时间
         *
         * @return last_login_time - 上次登陆时间
         */
        public Integer getLastLoginTime() {
            return lastLoginTime;
        }
    
        /**
         * 设置上次登陆时间
         *
         * @param lastLoginTime 上次登陆时间
         */
        public void setLastLoginTime(Integer lastLoginTime) {
            this.lastLoginTime = lastLoginTime;
        }
    
        /**
         * 获取上次登录IP
         *
         * @return last_login_ip - 上次登录IP
         */
        public String getLastLoginIp() {
            return lastLoginIp;
        }
    
        /**
         * 设置上次登录IP
         *
         * @param lastLoginIp 上次登录IP
         */
        public void setLastLoginIp(String lastLoginIp) {
            this.lastLoginIp = lastLoginIp == null ? null : lastLoginIp.trim();
        }
    
        /**
         * 获取登陆次数
         *
         * @return login_count - 登陆次数
         */
        public Integer getLoginCount() {
            return loginCount;
        }
    
        /**
         * 设置登陆次数
         *
         * @param loginCount 登陆次数
         */
        public void setLoginCount(Integer loginCount) {
            this.loginCount = loginCount;
        }
    }
    View Code

    而这里User需要实现序列化,所以要实现Serializable类

    解决方案:

      MyBatis Generator提供了SerializablePlugin插件用来在代码生成时实现序列化

      使用:在配置文件 mybatis-generator.xml 中 SerializablePlugin 插件,添加

    <plugin type="org.mybatis.generator.plugins.SerializablePlugin" />

    完整的配置

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE generatorConfiguration
            PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
            "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    <generatorConfiguration>
        <context id="testTables" targetRuntime="MyBatis3Simple" defaultModelType="flat">
            <plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
            <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
                <!-- 该配置会使生产的Mapper自动继承MyMapper -->
                <property name="mappers" value="com.sfn.bms.common.config.MyMapper" />
                <!-- caseSensitive默认false,当数据库表名区分大小写时,可以将该属性设置为true -->
                <property name="caseSensitive" value="false"/>
            </plugin>
    
            <!-- 阻止生成自动注释 -->
            <commentGenerator>
                <property name="javaFileEncoding" value="UTF-8"/>
                <property name="suppressDate" value="true"/>
                <property name="suppressAllComments" value="true"/>
            </commentGenerator>
    
            <!-- 数据库链接地址账号密码 -->
            <jdbcConnection
                    driverClass="com.mysql.cj.jdbc.Driver"
                    connectionURL="jdbc:mysql://localhost:3306/bms?serverTimezone=Asia/Shanghai&amp;nullCatalogMeansCurrent=true"
                    userId="root"
                    password="root">
            </jdbcConnection>
    
            <javaTypeResolver>
                <property name="forceBigDecimals" value="false"/>
            </javaTypeResolver>
    
            <!-- 生成Model类存放位置 -->
            <javaModelGenerator targetPackage="com.sfn.bms.system.model" targetProject="src/main/java">
                <property name="enableSubPackages" value="true"/>
                <property name="trimStrings" value="true"/>
            </javaModelGenerator>
    
            <!-- 生成映射文件存放位置 -->
            <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
                <property name="enableSubPackages" value="true"/>
            </sqlMapGenerator>
    
            <!-- 生成Dao类存放位置 -->
            <!-- 客户端代码,生成易于使用的针对Model对象和XML配置文件的代码
                type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象
                type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 -->
            <javaClientGenerator type="XMLMAPPER" targetPackage="com.sfn.bms.system.mapper" targetProject="src/main/java">
                <property name="enableSubPackages" value="true"/>
            </javaClientGenerator>
    
            <!-- 配置需要生成的表 -->
            <table tableName="USER" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
                <generatedKey column="id" sqlStatement="mysql" identity="true"/>
            </table>
        </context>
    </generatorConfiguration>
    View Code

    重新执行generator,生成User

    package com.sfn.bms.system.model;
    
    import java.io.Serializable;
    import javax.persistence.*;
    
    public class User implements Serializable {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Short id;
    
        /**
         * 账号
         */
        private String account;
    
        /**
         * 密码
         */
        private String password;
    
        /**
         * 邮箱
         */
        private String email;
    
        /**
         * 状态 1-正常,0-禁用,-1-删除
         */
        private Boolean status;
    
        /**
         * 添加时间
         */
        @Column(name = "create_time")
        private Integer createTime;
    
        /**
         * 上次登陆时间
         */
        @Column(name = "last_login_time")
        private Integer lastLoginTime;
    
        /**
         * 上次登录IP
         */
        @Column(name = "last_login_ip")
        private String lastLoginIp;
    
        /**
         * 登陆次数
         */
        @Column(name = "login_count")
        private Integer loginCount;
    
        private static final long serialVersionUID = 1L;
    
        /**
         * @return id
         */
        public Short getId() {
            return id;
        }
    
        /**
         * @param id
         */
        public void setId(Short id) {
            this.id = id;
        }
    
        /**
         * 获取账号
         *
         * @return account - 账号
         */
        public String getAccount() {
            return account;
        }
    
        /**
         * 设置账号
         *
         * @param account 账号
         */
        public void setAccount(String account) {
            this.account = account == null ? null : account.trim();
        }
    
        /**
         * 获取密码
         *
         * @return password - 密码
         */
        public String getPassword() {
            return password;
        }
    
        /**
         * 设置密码
         *
         * @param password 密码
         */
        public void setPassword(String password) {
            this.password = password == null ? null : password.trim();
        }
    
        /**
         * 获取邮箱
         *
         * @return email - 邮箱
         */
        public String getEmail() {
            return email;
        }
    
        /**
         * 设置邮箱
         *
         * @param email 邮箱
         */
        public void setEmail(String email) {
            this.email = email == null ? null : email.trim();
        }
    
        /**
         * 获取状态 1-正常,0-禁用,-1-删除
         *
         * @return status - 状态 1-正常,0-禁用,-1-删除
         */
        public Boolean getStatus() {
            return status;
        }
    
        /**
         * 设置状态 1-正常,0-禁用,-1-删除
         *
         * @param status 状态 1-正常,0-禁用,-1-删除
         */
        public void setStatus(Boolean status) {
            this.status = status;
        }
    
        /**
         * 获取添加时间
         *
         * @return create_time - 添加时间
         */
        public Integer getCreateTime() {
            return createTime;
        }
    
        /**
         * 设置添加时间
         *
         * @param createTime 添加时间
         */
        public void setCreateTime(Integer createTime) {
            this.createTime = createTime;
        }
    
        /**
         * 获取上次登陆时间
         *
         * @return last_login_time - 上次登陆时间
         */
        public Integer getLastLoginTime() {
            return lastLoginTime;
        }
    
        /**
         * 设置上次登陆时间
         *
         * @param lastLoginTime 上次登陆时间
         */
        public void setLastLoginTime(Integer lastLoginTime) {
            this.lastLoginTime = lastLoginTime;
        }
    
        /**
         * 获取上次登录IP
         *
         * @return last_login_ip - 上次登录IP
         */
        public String getLastLoginIp() {
            return lastLoginIp;
        }
    
        /**
         * 设置上次登录IP
         *
         * @param lastLoginIp 上次登录IP
         */
        public void setLastLoginIp(String lastLoginIp) {
            this.lastLoginIp = lastLoginIp == null ? null : lastLoginIp.trim();
        }
    
        /**
         * 获取登陆次数
         *
         * @return login_count - 登陆次数
         */
        public Integer getLoginCount() {
            return loginCount;
        }
    
        /**
         * 设置登陆次数
         *
         * @param loginCount 登陆次数
         */
        public void setLoginCount(Integer loginCount) {
            this.loginCount = loginCount;
        }
    }
    View Code

    前后生成User的区别:

      1.实现了Serializable接口

      2.增加了private static final long serialVersionUID = 1L;

    问题解决

  • 相关阅读:
    python 获取文件大小,创建时间和访问时间
    url中的20%、22%、26%、7B%、%7D、28%、29% 代表真实的字符(转发)
    python3 采集需要登录的网页数据
    python3 模拟鼠标中轴滚动
    python3 爬虫小技巧,
    马拉松中级训练计划
    python 使用夜神模拟器
    Python3+mitmproxy安装使用教程(Windows)(转载)
    adb server version (31) doesn't match this client (41); killing...
    appium+python环境搭建
  • 原文地址:https://www.cnblogs.com/baby123/p/11077519.html
Copyright © 2011-2022 走看看