2014-10-26 1 views
18

с последней версией объективировать (5.1), я получаю следующее сообщение об ошибке при попытке доступа к методу точки у()объективизации 5,1 Контекст Не начато Ошибка из-за отсутствия ObjectifyFilter

Вы не начали контекст объективировать. Вероятно, вам не хватает ObjectifyFilter. Если вы не работаете в контексте HTTP-запроса, обратитесь к методу ObjectifyService.run().

я бегу его из веб-приложения Appengine, тот же код и конфигурация работала отлично в старых версиях

следующие моя конфигурация, аналогично примеру, представленной в объективизации документации

web.xml

<filter> 
    <filter-name>ObjectifyFilter</filter-name> 
    <filter-class>com.googlecode.objectify.ObjectifyFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>ObjectifyFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

OfyService класс

public class OfyService { 

static { 
    long start = System.currentTimeMillis(); 

    factory().register(User.class); 

    log.info(" Entity Registration took : {} ms", (System.currentTimeMillis() - start)); 
} 

public static Objectify ofy() { 
    return ObjectifyService.ofy(); 
} 

public static ObjectifyFactory factory() { 
    return (ObjectifyFactory) ObjectifyService.factory(); 
} 
} 

, но я определил ObjectifyFilter, любая идея, почему я получаю эту ошибку? и как я могу это исправить?

Спасибо!

UPDATE:

Я обновил объективизации версию v5.1.5, но до сих пор этот вопрос не решен любые обновления по этому вопросу?

+0

Проверьте, если вы звоните точки у() на запуск, например по какой-то причине - вне сферы действия запроса - тогда вы не прошли через ObjectifyFilter. – koma

+0

Нет, он не называется нигде, я строго вызываю из (через класс OfyService, также FYI, тот же код работает отлично в версии до 5.1. –

+1

Убедитесь, что 1) вы не вызываете ofy() до того, как фильтр установлен; скажем, от другого фильтра выше в цепочке и 2), что у вас нет нескольких версий объективации в вашем пути к классам (mvn clean). Вы должны иметь возможность посмотреть на стек и посмотреть, какой код пытается использовать объектизацию вне фильтра; если фильтр был установлен, вы увидите его в стеке. Отправьте его. – stickfigure

ответ

-1
import static com.googlecode.objectify.ObjectifyService.ofy; 

import java.util.List; 
... 
import ar.com.cra.entity.State; 
import com.googlecode.objectify.ObjectifyService; 

@Controller 
@RequestMapping("/state") 
public class StateController { 

    @RequestMapping(value = "/addState", method = RequestMethod.GET) 
    public String getAddState(ModelMap model) { 
     return "state/add"; 
    } 

    @RequestMapping(value = "/add", method = RequestMethod.POST) 
    public ModelAndView add(HttpServletRequest request, ModelMap model) { 

     ObjectifyService.register(State.class); 

     State state; 
     try { 
      state = new State(); 
      state.setName(request.getParameter("name")); 
      state.setShortName(request.getParameter("shortName")); 
      ofy().save().entity(state).now(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return new ModelAndView("redirect:list"); 

    } 

UPDATE

public class DatastoreService { 

    static { 
     factory().register(State.class); 
    } 

    public static Objectify ofy() { 
     return ObjectifyService.ofy(); 
    } 
} 
+2

это не рекомендуемый способ регистрации услуги общности, также каждый раз, когда вы вызываете этот путь, и регистрируетесь каждый раз –

+0

спасибо! Я этого не знаю. – Guillermo81

0

я с той же проблемой. Я нашел причину проблемы (для меня). Я использую Guice и sitebricks для создания моих задних служб.

Проблема

Для того, чтобы использовать объективизации я должен был связать ObjectifyFilter, как Singleton в одном из своих модулей. Модуль, который я выполнял связывание, расширяет ServletModule, который установлен через Guice в SitebricksModule, где я привязываю свои услуги к URL-адресам. Затем SiteBricksModule передают инжектору Гиса.

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

Решения, которые я нашел

  • Я отделил два модуля и передал их обоих к инжектору Guices'S.

или

  • Отдельные Objectify такие вещи, как связывание фильтра и указав шаблон фильтра в другом модуле и передать первый инжектор Guice в.

Надеюсь, это поможет!

0

Я только начал использовать Objectify и имел ту же проблему, что и вы. Я просто не читаю the setup information ... Просто добавить, что на моем web.xml, и она работала:

<filter> 
    <filter-name>ObjectifyFilter</filter-name> 
    <filter-class>com.googlecode.objectify.ObjectifyFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>ObjectifyFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
1

убедитесь класс вашего StartupActions выглядит следующим образом:

@Start(order=100) 
public void generateDummyDataWhenInTest() { 
    if (ninjaProperties.isDev()) { 
     try (Closeable closeable = ObjectifyService.begin()) { 
      ObjectifyProvider.setup(); 
     } catch (IOException ex) { 
      Logger.getLogger(StartupActions.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

Мы должны зафиксировали, что долго назад в архетипе, но это не очень высоко в списке prio. Было бы замечательно, если вы могли бы подтолкнуть PR :)

0

Я сталкивается с той же ошибки и this solusion работал для меня

добавить в web.xml

<filter> 
    <filter-name>ObjectifyFilter</filter-name> 
    <filter-class>com.googlecode.objectify.ObjectifyFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>ObjectifyFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>INCLUDE</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping> 
Смежные вопросы