Objectify 5.1 Context Not Started Ошибка из-за отсутствия ObjectifyFilter
с последней версией Objectify (5.1), я получаю следующую ошибку, когда пытаюсь получить доступ к методу ofy()
Вы не начали контекст Objectify. Вероятно, вам не хватает 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:
Я обновил версию objectify до версии 5.1.5, но все же проблема не устранена при обновлении?
Ответы
Ответ 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:)
Ответ 2
У меня была такая же проблема.
Я нашел причину проблемы (для меня). Я использовал Guice и sitebricks для создайте мои службы back end.
Проблема
Чтобы использовать Objectify, мне пришлось привязать ObjectifyFilter
как Singleton в одном из моих модулей. Модуль, который выполнял привязку, расширяет ServletModule
, который установлен через Guice в SitebricksModule
, где я привязываю свои сервисы к URL-адресам. Затем SitebricksModule
передается в инжектор Гие.
Я заметил, что когда я устанавливал один модуль в другой, проблема сохранялась.
Решения, которые я нашел
- Я отделил два модуля и передал их как для инжектора Guices.
или
- Разделяйте
Objectify
вещи как привязку фильтра и задание шаблона фильтра в другом модуле и передайте это сначала в инжектор Guice.
Надеюсь, это поможет!
Ответ 3
Я только начал использовать Objectify и имел ту же проблему, что и вы. Я просто не читаю информацию об установке... Просто добавьте, что на моем 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>
Ответ 4
Я столкнулся с той же ошибкой, и это решение работало для меня
добавить в 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>
Ответ 5
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");
}
ОБНОВЛЕНИЕ
public class DatastoreService {
static {
factory().register(State.class);
}
public static Objectify ofy() {
return ObjectifyService.ofy();
}
}