2013-11-25 3 views
1

EDIT2 : 이것에

그래서 다른 헤드 업 : 난 아직도 이런 이유를 모르겠지만, 나는 그것을 가지고 jOOQ과 방언과 비슷한 문제를 지금 가지고있는 . 내 코드는 여기에 다음과 같습니다NPE 발에 접근

object MyDB { 
    private lazy val dialect = SQLDialect.POSTGRES 
    def withSession[T](f: DSLContext => T) = f(DSL.using(getConnectionPool, dialect)) 
} 

나는 제거하면 내가 방언이 어디 선을 될 일이 https://github.com/jOOQ/jOOQ/blob/version-3.2.0/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java

라인 (552)에 jOOQ 쿼리를 실행하려고 할 때이 불면은 "게으른" 평가. 내가 추가 한 후에 게으른 모든 것이 예상대로 작동합니다.

아마도이 문제는 LiftWeb의 스레딩 문제이며 실행중인 스레드가 올바른 값을 볼 수 없습니까? 나는 아무 생각이 ...

편집 :

단순히 첫 번째, 깨진 버전의 값에 게으른을 추가하여 내가 원하는 것을 할 수있는 방법을 발견했다. 그래서 게으른 값으로 모든 것이 잘 작동합니다. 그러나 나는이 행동을 설명하는 방법을 모르기 때문에이 자리를 열어 두도록하겠습니다.

원래의 게시물 :

그래서 내가 슬릭에서 매개 변수화 된 쿼리를 사용하는 것을 시도하고있다. 내 코드가 아래 있습니다. 내 문제는 웹 응용 프로그램 (liftweb, 컨테이너가 sbt로 시작됨) 내에서 실행하려고하면 NPE (주석 참조)가 생깁니다 (응용 프로그램에서 주어진 PlayerListCollector 클래스의 객체를 만듭니다. 문자열 "콜라") 이클립스에서 응용 프로그램으로 개체를 실행할 때 아래쪽에 println 잘 작동합니다. 이런 이유가 전혀 생각이 없다

[...] 
object PlayerListCollector extends Loggable with App{ 

    private def executeSearch(term: String) = { 
     val searchNameCurrent = Parameters[String].flatMap { 
     case (term) => { 
      for { 
      p <- Players if p.uberName.isNotNull 
      n <- p.displayName if (n.displayName.toLowerCase.like(term)) 
      } yield (p.id, n.displayName) 
     } 
     } 

    val lowerTerm = "%"+term.toLowerCase()+"%" 
    logger info "HELLO " +lowerTerm // prints HELLO %cola% 
    val foo = searchNameCurrent(lowerTerm) // executes just fine when the query is in a local val 
    logger info foo 
    val byCurrent = foo.list 
    logger info byCurrent // prints expected output 

    [...] 
    } 
    [...] 
} 

:이 같이하는 코드를 변경할 때

class PlayerListCollector(term: String) { 
    import PlayerListCollector._ 
    val searchResult = executeSearch(term) 
} 

object PlayerListCollector extends Loggable with App{ 
    private val searchNameCurrent = Parameters[String].flatMap { 
    case (term) => { 
     for { 
     p <- Players if p.uberName.isNotNull 
     n <- p.displayName if (n.displayName.toLowerCase.like(term)) 
     } yield (p.id, n.displayName) 
    } 
    } 

    private def executeSearch(term: String) = { 
    val lowerTerm = "%"+term.toLowerCase()+"%" 
    logger info "HELLO " +lowerTerm // prints HELLO %cola% 
    val foo = searchNameCurrent(lowerTerm) // NPE right in this line 
    logger info foo // never executed from here on ... 
    val byCurrent = foo.list 
    logger info byCurrent 

    [...] 
    } 

    // this works if run directly from within eclipse! 
    println(DB withSession { 
    searchNameCurrent("%cola%").list 
    }) 
} 

문제

는 사라진다. 매개 변수가있는 쿼리의 요점이 한 번만 값으로 채워지는 val에 넣지 않으므로 여러 번 컴파일 할 필요가 없습니까?

답변