[alibaba/fastjson]FASTJSON会使对象关联属性的惰性加载失效(使用的是mybatis)

2025-11-24 403 views
4

use实体r里两个关联字段 定义 one to many关系 @Transient private List roles; @Transient private List permissions; mybatis mapper @Select("select * from sys_user where username = #{username}") @ResultType(SysUser.class) @Results(value = { @Result(id = true, column = "uid", property = "uid"), @Result(property = "roles", column = "uid", many = @Many(fetchType = FetchType.LAZY, select = "com.cms.mapper.RoleMapper.findRolesByUid")) , @Result(property = "permissions", column = "uid", many = @Many(fetchType = FetchType.LAZY, select = "com.cms.mapper.PermissionMapper.findPermissionsByUid")) }, id = "userRolesPermission") SysUser findByUsername(String username);

springboot 响应配置 @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { super.configureMessageConverters(converters);

    FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
   FastJsonConfig fastJsonConfig = new FastJsonConfig();
    fastJsonConfig.setSerializerFeatures(
            SerializerFeature.PrettyFormat,
            SerializerFeature.QuoteFieldNames

    );
    fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
    fastConverter.setFastJsonConfig(fastJsonConfig);
    List<MediaType> fastMediaTypes = new ArrayList<>();
    fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
    fastConverter.setSupportedMediaTypes(fastMediaTypes);
    converters.add(fastConverter);
}

结果: { "createTime":"2017-06-18 16:37:15", "email":"xxxxxx@qq.com", "lastLoginTime":"2017-06-19 13:23:27", "loginCount":0, "mobile":"xxxxxxxxx", "password":"7cf7494c4396c2083bc92e34c88471f2a4586ca768dd3f8549ace79718e22432", "permissions":[ { "cname":"系统后台主页", "method":"GET", "permissionId":1, "permissionName":"SYSTEM_MAIN", "pid":0, "props":"", "status":1, "url":"/system/main" } ], "roles":[ { "cname":"超级管理员", "createTime":"2017-06-18 16:31:05", "description":"系统所有权限拥有者", "pid":0, "roleId":1, "roleName":"ROLE_SUPERADMIN", "weight":100 } ], "status":1, "type":1, "uid":1, "username":"wxx" } 莫名其妙关联属性全加载了 并没有主动调用者两个关联属性的 get方法,把fastjson的响应配置取消后调试发现 发生惰性加载又正常 了 怀疑是fastjson检测属性的时候触发了关联调用 导致 mybatis惰性 加载失效,或者是我哪里没配置好,求大腿来帮解决下。

回答

3

什么版本?

7

1.2.30-1.2.33 都试过 一样的结果 更低的版本没尝试过。

8

环境有点复杂。我试试复现一下。

另外: springboot+mybatis+shiro配置权限,不建议user里级联role和permission, user是业务经常用到的model,role和permission则是只有authc才用,适用范围和频率差别很大。

4

构建了一个测试,没发现问题(roles和permissions都没有出现),代码在: http://git.oschina.net/nicefish/nicefish-backend 分支:testMybatis

访问:http://localhost:8080/

{
    "email":"kimmking@163.com",
    "password":"398a8c9d73da4c0e7f320952b06decdefcc97586305b0d51b1093ae95d8dc476ca63cc22ce64bbc344ad55b52d035cba5f3f2c21801afd561412f665bbcb5c45",
    "userName":"kimmking"
}
7

十分感谢,经建议把两个关联属性 抽离到一VO类中去了,现在没啥问题了。