2014-07-12 4 views
0

Grails Framework - Reference Documentation에서 Collections 및 Maps에 바인딩하는 다음 예제가 예외로 표시된 경우 실패하는 이유는 무엇입니까?grails 데이터 바인딩 모음

class Band { 
    String name 
    static hasMany = [albums: Album] 
    List albums 
} 
class Album { 
    String title 
    Integer numberOfTracks 
} 

def bindingMap = [name: 'Genesis', 
        'albums[0]': [title: 'Foxtrot', numberOfTracks: 6], 
        'albums[1]': [title: 'Nursery Cryme', numberOfTracks: 7]] 
def band = new Band(bindingMap) 

assert band.name == 'Genesis' 
assert band.albums.size() == 2 
assert band.albums[0].title == 'Foxtrot' 
assert band.albums[0].numberOfTracks == 6 
assert band.albums[1].title == 'Nursery Cryme' 
assert band.albums[1].numberOfTracks == 7 


≫ groovy.lang.MissingPropertyException: No such property: albums[0] for class: Band Possible solutions: albums at Script1.run(Script1.groovy:15) at org.grails.plugins.console.ConsoleService.eval(ConsoleService.groovy:57) at org.grails.plugins.console.ConsoleService.eval(ConsoleService.groovy:37) at org.grails.plugins.console.ConsoleController.execute(ConsoleController.groovy:32) at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:198) at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63) at grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter.doFilter(GrailsAnonymousAuthenticationFilter.java:53) at grails.plugin.springsecurity.web.authentication.RequestHolderAuthenticationFilter.doFilter(RequestHolderAuthenticationFilter.java:49) at grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter.doFilter(MutableLogoutFilter.java:82) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:722) 

답변

1

: 이것처럼

// grails-app/domain/demo/Band.groovy 
package demo 

class Band { 
    String name 
    static hasMany = [albums: Album] 
    List albums 
} 

이 단위 테스트는 통과 할 것이다 :

// test/unit/demo/BandSpec.groovy 
package demo 

import grails.test.mixin.TestFor 
import spock.lang.Specification 

@TestFor(Band) 
class BandSpec extends Specification { 

    void "test constructor binding"() { 
     given: 
     def bindingMap = [name: 'Genesis', 
          'albums[0]': [title: 'Foxtrot', numberOfTracks: 6], 
          'albums[1]': [title: 'Nursery Cryme', numberOfTracks: 7]] 
     when: 
     def band = new Band(bindingMap) 

     then: 
     band.name == 'Genesis' 
     band.albums.size() == 2 
     band.albums[0].title == 'Foxtrot' 
     band.albums[0].numberOfTracks == 6 
     band.albums[1].title == 'Nursery Cryme' 
     band.albums[1].numberOfTracks == 7 
    } 
} 

해당 코드는 프로젝트의 https://github.com/jeffbrown/bindingissue에 있습니다.

표시되는 문제의 원인은 Band이 도메인 클래스로 인식되지 않는 것입니다. 클래스가 grails-app/domain/어딘가에 정의되어 있는지 확인하십시오. Grails가 제공하는 특별한 데이터 바인딩은 일반적으로 생성자에서 사용할 수 없습니다. 도메인 클래스는 예외입니다.

도움이 되었기를 바랍니다.

+0

'Band'가 도메인 클래스가 아니면'hasMany' 속성은 의미가 없습니다. 도메인 클래스가 아닌 경우 hasMany를 제거하고 "albums [0]"과 같은 다른 기능을 처리하는 방법을 알고있는 데이터 바인딩 메커니즘을 활용하려면 생성자를 사용할 수 없으며 대신 명시 적으로 데이터 바인더를 호출해야합니다. 예를 들어, 컨트롤러에서'bindData (bandInstance, bindingMap)'와 같은 것을 호출 할 수 있습니다. 여기서'bandInstance'는'Band' 클래스의 인스턴스이고'bindingMap'은 위에서 설명한'Map'입니다. –

+0

실제로 참조 문서를 읽을 때 자세한 내용에주의를 기울여야합니다 !!! 참조 문서에서 다음과 같이 말합니다 : 다음 코드는 도메인 클래스에서 객체 목록을 채우는 간단한 예제를 보여줍니다 ... 'domain class'에 밑줄을 긋습니다. Jeff, 당신은 도메인 클래스가 아닌 도메인 클래스 바인딩에 대해 언급 한 두 가지 경우 모두에 대해 옳았습니다. 이미 두 가지를 모두 테스트했습니다. 고마워. – user3670996

+0

'Band' 클래스가 도메인 클래스가 아니라고 말하는 것 같습니다. 그렇다면'hasMany' 선언을 도메인 클래스 밖에서 의미가 없으므로 제거 할 수 있습니다. –

0

나는 문제가 추측 - 당신의 바인딩 맵에 - 당신은 속성의 이름을 선택했다 "앨범을 [0]"대신 모음 "앨범"을 사용하고 두 항목을주는. Groovy가 목록을 찾고 있지만이 표현식을 속성으로 만들었습니다. 앨범을 먼저 만든 다음 앨범 목록에 추가하십시오.

앨범 :

// grails-app/domain/demo/Album.groovy 
package demo 

class Album { 
    String title 
    Integer numberOfTracks 
} 

밴드 :이 같은이있는 경우

def bindingMap = [ 
    name: 'Genesis', 
    'albums': [ 
    [title: 'Foxtrot', numberOfTracks: 6], 
    [title: 'Nursery Cryme', numberOfTracks: 7] 
    ] 
] 
+1

Band가 도메인 클래스 인 경우이 문제는 올바르지 않습니다. 도메인 클래스 생성자는지도의 "albums [0]"키를 처리하는 방법을 알고 있습니다. 'Band'는'hasMany' 속성을 정의하기 때문에 그것이 도메인 클래스라고 가정합니다. –