2014-03-27 33 views
1

這裏是我的問題:我試圖填補以下地圖:如何在Groovy中使用java.util.Date作爲地圖的關鍵

class Driver extends User{ 


final UserRole role = UserRole.DRIVER 
Map<Date, Route> routes = [:] 

static hasMany = [ 
    assignedJobs:Job 
] 

static mappedBy = [ 
    assignedJobs:'assignedUser' 
] 
static constraints = { 
} 
} 

下面的代碼填充它:

def private addStationToRoute(driver, station){ 
    def route = driver.routes.get(station?.estimatedArrival.clearTime()) 
    if(route == null) 
     route = new Route() 
//  route.stations.add(station) 
//  route.stations.sort({it.position}) 
    def key = station?.estimatedArrival.clearTime() 
    driver.routes.put(key, route) 
} 

這使我一個ClassCastException:

java.util.Date cannot be cast to java.lang.String. Stacktrace follows: 
Message: java.util.Date cannot be cast to java.lang.String 
Line | Method 
->> 97 | $tt__save in elektrova.JobController 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
| 200 | doFilter in grails.plugin.cache.web.filter.PageFragmentCachingFilter 
|  63 | doFilter in grails.plugin.cache.web.filter.AbstractFilter 
| 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor 
| 615 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker 
^ 744 | run  in java.lang.Thread 

一些研究,我發現,把鑰匙paranthesis應該做的伎倆後 (來源: http://groovy.codehaus.org/Collections maps部分 http://mrhaki.blogspot.de/2009/11/groovy-goodness-complex-keys-in-maps.html

這導致我在嘗試此:

def private addStationToRoute(driver, station){ 
    def route = driver.routes.get(station?.estimatedArrival.clearTime()) 
    if(route == null) 
     route = new Route() 
//  route.stations.add(station) 
//  route.stations.sort({it.position}) 
    def key = station?.estimatedArrival.clearTime() 
    driver.routes[(key)] = (route) 
} 

任何建議,該怎麼辦? (順便說一句,我試着改變它爲key.toString(),這使得異常消失) 在此先感謝!同時節省發生 錯誤:

編輯

@Transactional 
def save(Job jobInstance) { 
    if (jobInstance == null) { 
     notFound() 
     logNotFound("save", Job.class) 

     return 
    } 

    setSaveConditions(jobInstance) 
    setUpdateConditions(jobInstance) 
    jobService.createStationsForJob(jobInstance) 
    if(jobInstance.assignedUser) 
     jobService.addStationsToRoute(jobInstance) 
    jobInstance.validate() 
    if (jobInstance.hasErrors()) { 
     respond jobInstance.errors, view:'create' 
     return 
    } 
    println 'routes: ' + jobInstance.assignedUser.routes.toString() 
    jobInstance.save flush:true 
    println 'routes: ' + jobInstance.assignedUser.routes.toString() 
    logSaving(jobInstance) 
    request.withFormat { 
     form { 
      flash.message = message(code: 'default.created.message', args: [ 
       message(code: 'job.label', default: 'Job'), 
       jobInstance.encodeAsHTML() 
      ]) 
      redirect jobInstance 
     } 
     '*' { respond jobInstance, [status: CREATED] } 
    } 
} 

Grails的告訴我錯誤行是包含jobInstance.save沖洗之一:真。 jobInstance具有包含Map的驅動程序屬性。當我使用字符串表示路由對象發生同樣的錯誤:

Message: elektrova.Route cannot be cast to java.lang.String 
Line | Method 
->> 97 | $tt__save in elektrova.JobController$$EOZiJFlq 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
| 200 | doFilter in grails.plugin.cache.web.filter.PageFragmentCachingFilter 
|  63 | doFilter in grails.plugin.cache.web.filter.AbstractFilter 
| 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor 
| 615 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker 
^ 744 | run  in java.lang.Thread 

,當我使用該路由的字符串表示保存完成。但是爲什麼在這個世界上地圖期望兩個字符串呢?

EDIT2:

域類:

class Job implements Serializable{ 


JobStatus status = JobStatus.ACTIVE 
Station startStation 
Station endStation 


String containerNumber 
String loadingIndicator = false 
String containerISO 
String oversizeIndicator = false 
Double grossWeight = 0 
Boolean nonOperatingReeferIndicator = false 
String iReference 
String consigneeReference 
String quayAccountNumber 
String carrierCode 
String bookingReference 
String releaseNumber 
String transportMeansIdentification 
Boolean trainTransportIndicator = false 
Boolean dangerousGoodsIndicator = false 
String gegisReference 
Boolean customsIndicator = false 
String registrationNumber 
String registrationPositon 


Date creationTimeStamp 
User updateUser 
Date updateTimeStamp 

boolean deleted = false 

static belongsTo = [ 
    hauler:Hauler, 
    assignedUser:Driver, 
    creationUser:Disponent 
] 




static constraints = { 
    hauler(blank:false, nullable:false) 
    status(blank:false, nullable:false) 
    endStation(nullable:true) 
    startStation(nullable:true)  

    assignedUser(nullable:true) 
    containerNumber(nullable:true) 
    containerISO(nullable:true) 
    iReference(nullable:true) 
    consigneeReference(nullable:true) 
    quayAccountNumber(nullable:true) 
    carrierCode(nullable:true) 
    bookingReference(nullable:true) 
    releaseNumber(nullable:true) 
    transportMeansIdentification(nullable:true) 
    gegisReference(nullable:true) 
    registrationNumber(nullable:true) 
    registrationPositon(nullable:true) 


    updateUser(nullable:true) 
    updateTimeStamp(nullable:true) 

    creationTimeStamp(blank:false, nullable:false) 
    creationUser(blank:false, nullable:false) 
} 



def cancel(){ 
    this.status = JobStatus.CANCELLED 
} 

def finish(){ 
    this.status = JobStatus.DONE 
} 

// @Override 
// def encodeAsHTML(){ 
////  destination.locationName + " (" + containerNumber + ") " + plannedArrivalTime.toString() 
// } 
} 

class Route { 

// List<Station> stations = [] 
// 
// static belongsTo = [ 
//  hauler:Hauler, 
//  driver:Driver 
// ] 

// static hasMany = [ 
//  jobs:Job 
// ] 
} 
+3

我不會使用日期作爲映射鍵,因爲它是可變的: -/ –

+0

如果您使用的是初始化語法,例如: 'routes = [(key):value]'。 Groovy不應該成爲問題(除了tim_yates提到的問題之外,您可以在Groovy中執行此操作)。你的錯誤來自Grails。你在做什麼?驅動程序是一個域類嗎? – micha

+0

是的,保存驅動程序類時出現問題 – olkoza

回答

0

您可以使用一個日期作爲地圖的關鍵,你在你的地圖上的聲明,這樣做,但你的問題實際上是關於確定一個問題並將其存儲在數據庫中。

相關問題