GAE JCache NumberFormatException, нужно ли мне писать Java, чтобы избежать?

Код ниже создает исключение NumberFormatException в этой строке:

val cache = cf.createCache(Collections.emptyMap())

Вы видите какие-либо ошибки?
Нужно ли мне напишите версию Java, чтобы избежать этого, или есть способ Scala?

...
import java.util.Collections
import net.sf.jsr107cache._

object QueryGenerator extends ServerResource {
  private val log = Logger.getLogger(classOf[QueryGenerator].getName)
}

class QueryGenerator extends ServerResource {
  def getCounter(cache:Cache):long = {
      if (cache.containsKey("counter")) {
        cache.get("counter").asInstanceOf[long]
      } else {
        0l
      }
    }

  @Get("html")
  def getHtml(): Representation = {
    val cf = CacheManager.getInstance().getCacheFactory()
    val cache = cf.createCache(Collections.emptyMap())

    val counter = getCounter(cache)

    cache.put("counter", counter + 1)

    val q = QueueFactory.getQueue("query-generator")
    q.add(TaskOptions.Builder.url("/tasks/query-generator").method(Method.GET).countdownMillis(1000L))

    QueryGenerator.log.warning(counter.toString)

    new StringRepresentation("QueryGenerator started!", MediaType.TEXT_HTML)
  }
}

Спасибо!


person Jasper    schedule 18.04.2010    source источник


Ответы (2)


Я подозреваю, что исключение действительно происходит при вызове getCounter. NumberFormatException выдается, когда вы пытаетесь преобразовать строку в число, и эта строка не содержит распознаваемого числа.

person Stephen C    schedule 18.04.2010

Я добавил небольшой класс Java для установки/обновления. Не самое элегантное решение, но оно работает. Решение Scala по-прежнему будет оценено.

Java:

import javax.cache.Cache;

public class CacheHelper {
    public static final void update(Cache cache,String key,Object value) {
        cache.put(key,value);
    }
}

Скала:

import java.util.Collections
import javax.cache.CacheManager
import somewhere.CacheHelper

object QueryGenerator extends ServerResource {
  private val log = Logger.getLogger(classOf[QueryGenerator].getName)
}

class QueryGenerator extends ServerResource {

  @Get("html")
  def getHtml(): Representation = {
    val cf = CacheManager.getInstance().getCacheFactory()
    val cache = cf.createCache(Collections.emptyMap())

    val counter = if (cache.containsKey("counter")) {
      cache.get("counter").asInstanceOf[Int]
    } else {
      0
    }

    CacheHelper.update(cache,"counter",counter+1)

    val q = QueueFactory.getQueue("query-generator")
    q.add(TaskOptions.Builder.url("/tasks/query-generator").method(Method.GET).countdownMillis(1000L))

    QueryGenerator.log.warning(counter.toString())

    new StringRepresentation("QueryGenerator started!", MediaType.TEXT_HTML)
  }
}
person Jasper    schedule 18.04.2010
comment
Два ваших фрагмента кода не эквивалентны: один использует Long, другой Int, и вы изменили свой импорт. Кроме того, вы переписали на Java строку кода, которая кажется не связанной с крахом. Вы уверены, что если вы напишите CacheHelper как объект в Scala, он сделает то же самое, что и сбой? (То есть object CacheHelper { def update ... }.) Было бы очень странно, если бы это было так. - person Rex Kerr; 18.04.2010
comment
Я не писал объект, но имел метод в классе QueryGenerator. Это вызвало некоторую ошибку, уже [упомянутую здесь] [k]. Извините за импорт и несоответствия типов. Я просто много играл в то же время. [k]: stackoverflow.com/questions/1657494/ - person Jasper; 19.04.2010