2012-02-01 3 views
1

Я использую Objectify как уровень доступа к данным в моем размещенном на GoogleAppEngine приложении.Объяснение встроенных карт не удается получить

Проблема возникает, когда я пытаюсь сохранить карту. Мой боб выглядит следующим образом:

@Entity 
@Cached 
class MyBean{ 
    @Id 
    private Long id; 
    @Embedded 
    Map<String, String> parameters = new HashMap<String, String>(); 

    public MyBean(){} 

    //getters and setters below 
} 

Прежде всего отметим, что карта «параметры» не является частным, он бросает исключение JRE. При сохранении карты все идет хорошо. Когда вы возвращаетесь из DataStore, он терпит неудачу.

Моим обходным путем является использование аннотации @Serialized. Это всего лишь обходное решение, так как я хочу, чтобы использовать функцию expando GAE Datastore.

Согласно objectify doc, я делаю правильные операции.

Сведения об исключении:

Вызванный: java.lang.NullPointerException на com.googlecode.objectify.impl.Transmog.loadSingleValue (Transmog.java:364) на com.googlecode.objectify. impl.load.EmbeddedMapSetter.safeSet (EmbeddedMapSetter.java:65) на com.googlecode.objectify.impl.load.CollisionDetectingSetter.set (CollisionDetectingSetter.java:37) на com.googlecode.objectify.impl.Transmog. loadSingleValue (Transmog.java:359) на com.googlecode.objectify.imp l.Transmog.load (Transmog.java:340) в com.googlecode.objectify.impl.ConcreteEntityMetadata.toObject (ConcreteEntityMetadata.java:203) в com.googlecode.objectify.impl.QueryImpl $ ToObjectIterator.translate (QueryImpl .java: 668) на com.googlecode.objectify.impl.QueryImpl $ ToObjectIterator.translate (QueryImpl.java:657) в com.googlecode.objectify.util.TranslatingIterator.next (TranslatingIterator.java:35)

ответ

4

Встроенные карты плохо поддерживались в Objectify3 и не должны публиковаться. Раздел на @Embedded Map был удален из документации Objectify3.

Objectify4 поддерживает карты широко, в том числе этих карт Expando стиля:

  • Map (или любой примитива)
  • Карты (ключевые ссылки)
  • Карты (встроенных классы

В Кроме того, есть аннотация @Mapify, которая позволяет вам взять обычную коллекцию объектов, выбрать одно свойство в качестве ключа и сохранить это как карту.

К сожалению, документация Objectify4 в настоящее время не готова. Однако исходный код активно используется несколькими сторонами. Если вы чувствуете смелость, соберитесь с сундука.

+0

Есть ли место в другом месте из репо SVN, в котором я могу получить 4ofy 4 lib? –

+0

Да, здесь: http://objectify-appengine.googlecode.com/svn/maven/com/googlecode/objectify/objectify/4.0a3/objectify-4.0a3.jar – stickfigure

+0

Все работает сладко с Ofy4, спасибо –

0

Я также рекомендую использовать Objectify 4 - я обновил свое приложение и нашел его достаточно простым в использовании. Я предпочитаю поддержку полей типа Map в частности.

Чтобы ответить на вопрос, вы никогда не должны ставить @Embedded на массив, содержащий только примитивы. Поэтому вам не нужно указывать @Embedded на вашей карте, потому что String примитивна в хранилище данных Google App Engine.

Смежные вопросы