Не удалось найти прокси для... в макросе
Я долго гонялся за следующей проблемой и надеюсь, что кто-то с большим опытом в этом вопросе поможет мне решить ее.
В моем тестовом случае точная ошибка выглядит следующим образом:
java.lang.IllegalArgumentException: Не удалось найти прокси для пользователя val: specs.BasicSpeC# Пользователь в списке (значение user, метод applyOrElse, метод $anonfun$new$97, значение fiveLetterNames, метод $anonfun$new$90, метод $ anonfun $ новый $20, значение, класс BasicSpec, спецификации пакета, пакет) (currentOwner= значение fiveLetterNames)
Тест можно найти здесь:
https://github.com/outr/reactify/blob/master/shared/src/test/scala/specs/BasicSpec.scala
Это оскорбительный макрос:
https://github.com/outr/reactify/blob/master/shared/src/main/scala/com/outr/reactify/Macros.scala
Без дополнительной информации об ошибке я затрудняюсь решить эту проблему. Любая помощь очень ценится.
2 ответа
У меня была такая же проблема в моем проекте. Решение состоит в том, чтобы не использовать одну и ту же "лямбду"* в макросах более одного раза.
"лямбда" - это следующее:
def macroSample[A, B](c: blackbox.Context)
(lambda: c.Expr[A => B] /* <- lambda */) = { ... }
PS на самом деле я не могу увидеть ваш оригинальный код прямо сейчас. Это решение работает в моем случае
Чтобы немного подробнее остановиться на приведенном выше ответе и моем опыте, я столкнулся с этой проблемой, используя quill.
Базовый код выглядел примерно так
case class Foo(id: FooID, bar: String, value Int)
case class FooState(FooId: FooId, state: String, stateCount: Int)
case class FooCurrentState(FooId: FooId, state: String)
def alsoUpdate(f: FooState) = {
Quote {
query[FooCurrentState].insert(
...
).onConflictUpdate(_.fooId)(...)
}
def doInsert(foo: Foo, state: String, stateCount) = {
val newFooState =
transaction {
run {
query[Foo].insert(lift(foo))
query[FooState].insert(lift(newFooState))
alsoUpdate(newFooState))
}
}
}
я получил
java.lang.IllegalArgumentException: не удалось найти прокси для newFooState
Основываясь на принятом ответе, я реорганизовал свой код, чтобы он был таким
case class Foo(id: FooID, bar: String, value Int)
case class FooState(FooId: FooId, state: String, stateCount: Int)
case class FooCurrentState(FooId: FooId, state: String)
def alsoUpdate(f: FooState) = {
Quote {
query[FooCurrentState].insert(
...
).onConflictUpdate(_.fooId)(...)
}
def doInsert(foo: Foo, state: String, stateCount) = {
val newFooState =
transaction {
run { query[Foo].insert(lift(foo)) }
run { query[FooState].insert(lift(newFooState)) }
run { alsoUpdate(newFooState)) }
}
}
}
Который скомпилировался без сбоя компилятора.