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에 넣지 않으므로 여러 번 컴파일 할 필요가 없습니까?