java – 使用Grails SortedSet时,无法从空列表中访问first()元素
发布时间:2020-12-15 05:05:11 所属栏目:Java 来源:网络整理
导读:我正在努力动态创建一些grails域对象,然后添加一个在另一个grails域对象中声明的SortedSet.我创建了一个Project类,填充了它的值,并检查以确保它是有效的.它是有效的,所以我想将此项目添加到员工. 我的代码基本上是这样的 Employee employee = Employee.get(s
我正在努力动态创建一些grails域对象,然后添加一个在另一个grails域对象中声明的SortedSet.我创建了一个Project类,填充了它的值,并检查以确保它是有效的.它是有效的,所以我想将此项目添加到员工.
我的代码基本上是这样的 Employee employee = Employee.get(session.empid) ... //populate some Project objects ... //add projects to employee employee.addToProjects(project) 这可能会出错?如果我执行project.validate(),然后检查错误,那么唯一一个表示该项目没有与之关联的有效员工 – 但是一旦我执行employee.addToProjects就应该消失. Employee有很多Project对象,它的声明如下: class Employee implements Comparable { static hasMany = [projects:Project] static constraints = { } static mapping = { projects cascade:"all,delete-orphan",lazy:false } SortedSet<Project> projects = new TreeSet<Project>(); } public class Project implements Comparable { static belongsTo = [employee:Employee] static hasMany = [roles:Role] static mapping = { roles lazy:false,cascade:"all,delete-orphan" } @XmlElement List<Role> roles = new ArrayList<Role>(); /* * return sorted list. overwriting default getter was causing error upon saving multiple roles. * */ def List getSortedRoles(){ Collections.sort(roles,new RoleComparator()); return roles; } String toString() { return name } // compare by latest date of roles,then by name + id //if this is too intrusive,implement comparator with this logic and sort on rendering page int compareTo(obj) { if(obj == null){ return 1; } def myMaxRole = findMaxRole(roles); def rhsMaxRole = findMaxRole(obj.roles); def rcomparator = new RoleComparator(); System.out.println(myMaxRole.title + " " + rhsMaxRole.title + " " + rcomparator.compare(myMaxRole,rhsMaxRole)); return rcomparator.compare(myMaxRole,rhsMaxRole); } def List getExpandableRoleList() { return LazyList.decorate(roles,FactoryUtils.instantiateFactory(Role.class)); } def setExpandableRoleList(List l) { return roles = l; } def Role findMaxRole(roles){ RoleComparator rc = new RoleComparator(); Role maxRole = roles.first(); for(role in roles){ if(rc.compare(maxRole,role) > 0){ maxRole = role; } } return maxRole; } public class Role implements Comparable { static belongsTo = [project:Project] static hasMany = [roleSkills:RoleSkill,roleTools:RoleTool] static mapping = { duties type:"text" roleSkills cascade:"all,lazy:false roleTools cascade:"all,lazy:false } static contraints = { endDate(nullable: true) } boolean _deleted static transients = ['_deleted'] @XmlElement String title = "" @XmlElement String duties = "" @XmlElement int levelOfEffort @XmlElement Date startDate = new Date() @XmlElement Date endDate = new Date() @XmlElement Date lastModified = new Date() @XmlElement LocationType locationType = new LocationType(type: "Unknown") @XmlElement String rank @XmlElement List<RoleSkill> roleSkills = new ArrayList<RoleSkill>() @XmlElement List<RoleTool> roleTools = new ArrayList<RoleTool>() String toString() { return title; } int compareTo(obj) { return title.compareTo(obj.title) } def skills() { return roleSkills.collect{it.skill} } def tools() { return roleTools.collect{it.tool} } } 解决方法
回到基础并使用你的对象编写了一个集成测试,一切正常,你必须在如何保存对象时出错
测试片段 void testSomething() { def emp = new Employee(first:"Aaron",last:"Saunders") emp.save() emp = Employee.get(1) emp.addToProjects(new Project(name:"Project 3")) emp.addToProjects(new Project(name:"Project 1")) emp.addToProjects(new Project(name:"Project 2")) emp.save() println Employee.get(1) println Employee.get(1).projects.first() } 我的对象.. public class Project implements Comparable { static belongsTo = [employee:Employee] String name; static mapping = { roles lazy:false,delete-orphan" } String toString() { return name } // compare by latest date of roles,implement comparator with this logic and sort on rendering page int compareTo(obj) { if(obj == null){ return 1; } return this.name.compareTo(obj.name); } } class Employee implements Comparable { static hasMany = [projects:Project] String first,last static constraints = { } static mapping = { projects cascade:"all,lazy:false } SortedSet<Project> projects = new TreeSet<Project>(); int compareTo(obj) { if(obj == null){ return 1; } return this.name.compareTo(obj.name); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ThreadPoolExecutor线程池任务执行失败的时候会怎样
- 2019JAVA第六次实验报告
- java – 运行其他jar文件时,Ant buildfile无法将jar文件放入
- java – `String.class`和`new Class [] {String.class}`有
- Java堆中的空间错误
- java对象初始化顺序验证示例
- java – 使用httpclient的4.0版本
- java中fastjson生成和解析json数据(序列化和反序列化数据)
- java – 由于不推荐使用Android getFragmentManager()API,还
- Java 9中如何对IntegerCache进行修改详解