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进行修改详解
