java.lang.UnsupportedOperationException译为:不支持的操作异常
原因一、
如果返回的是集合,应该设置为集合包含的元素类型,而不是集合本身。
实际案列
UserMapper.java
public List<String> getUserPhoneByName(String userName);
UserMapper.xml中resultType为集合本身
<select id="getUserPhoneByName" parameterType="String" resultType="java.util.List">
select t.user_phone from sys_user t where t.user_name=#{userName, jdbcType = VARCHAR}
</select>
解决方案
UserMapper.xml中resultType应该改为java.lang.String
<select id="getUserPhoneByName" parameterType="String" resultType="java.lang.String">
select t.user_phone from sys_user t where t.user_name=#{userName, jdbcType = VARCHAR}
</select>
原因二、
接收的集合本身就没有实现具体的添加操作,如一些内部类:java.util.Arrays.ArrayList、java.util.Collections.EmptyList
实际案列
实体类SysRole.java中集合sysUserBos
设置默认值为Collections.emptyList() ,导致集合类型为Collections
的内部类EmptyList,它的remove()、add()等操作都是继承于抽象类AbstractList,且没有具体的实现,所以添加元素时只能抛出UnsupportedOperationException
。
//用户实体
public class SysRole {
private Integer id;
private String roleName;
//一个角色关联多个用户
private List<SysUser> sysUserBos = Collections.emptyList();
//用户实体
public static class SysUser {
private Integer id;
private Integer roleId;
private String userName;
}
}
SysRoleMapper.xml
<resultMap id="sysRoleMap" type="com.jayknoxqu.entity.SysRole">
<id column="id" property="id" />
<result column="role_name" property="roleName" />
<collection property="sysUserBos" ofType="com.jayknoxqu.entity.SysRole$SysUser" javaType="java.util.List" >
<id column="user_id" property="id" />
<result column="user_name" property="userName" />
</collection>
</resultMap>
解决方案
设置集合sysUserBos
的默认值为new ArrayList<>(),或者直接去掉默认值
private List<SysUser> sysUserBos = new ArrayList<>();
注意: 在get方法中判断是是否为null,都会导致返回的数据为空数组
public List<SysUser> getSysUserBos() {
return sysUserBos != null ? sysUserBos : new ArrayList<>();
// return ListUtils.defaultIfNull(sysUserBos , new ArrayList<>());
// return ObjectUtils.defaultIfNull(sysUserBos, new ArrayList<>());
}
网友评论