由于缺少 ObjectifyFilter,Objectify 5.1 上下文未启动错误
Posted
技术标签:
【中文标题】由于缺少 ObjectifyFilter,Objectify 5.1 上下文未启动错误【英文标题】:Objectify 5.1 Context Not Started Error due to missing ObjectifyFilter 【发布时间】:2014-12-22 00:14:16 【问题描述】:使用最新版本的 Objectify (5.1),当我尝试访问 ofy() 方法时出现以下错误
您尚未启动 Objectify 上下文。您可能缺少 ObjectifyFilter。如果您不在 http 请求的上下文中运行,请参阅 ObjectifyService.run() 方法。
我从 appengine Web 应用程序运行它,相同的代码和配置在旧版本中运行良好
以下是我的配置,类似于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>
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 ,知道为什么会出现此错误吗?我该如何解决?
谢谢!
更新:
我已将 objectify 版本更新到 v5.1.5,但问题仍未解决,是否有任何更新?
【问题讨论】:
检查是否在启动时调用 ofy() 例如由于某种原因 - 超出了请求的范围 - 那么您还没有通过 ObjectifyFilter。 不,它没有在其他任何地方调用,我通过 OfyService 类严格调用 ofy(),仅供参考,相同的代码在 5.1 之前的版本中工作正常 检查以确保 1) 在安装过滤器之前您没有调用 ofy();比如说,也许来自链中更高的另一个过滤器,并且 2)您的类路径(mvn clean)上没有多个版本的 objectify。您应该能够查看堆栈跟踪并查看哪些代码试图在过滤器之外使用 objectify;如果安装了过滤器,您会在堆栈跟踪中看到它。发布它。 您的代码是否作为任务队列中的任务运行?我这样做了,所以我必须在之前添加Closeable closeable = begin();
和之后添加 closeable.close();
以避免出现错误。注意 begin() 来自于做import static com.googlecode.objectify.ObjectifyService.begin;
我已经试过了,但没有运气,它仍然会抛出同样的错误
【参考方案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);
我们早就应该在原型中解决这个问题,但它在优先级列表中并不是很高。如果你能推送 PR 那就太棒了:)
【讨论】:
【参考方案2】:我刚开始使用 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>
【讨论】:
【参考方案3】:我遇到了同样的错误,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>
【讨论】:
【参考方案4】: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();
【讨论】:
这不是推荐的注册objectify服务的方式,每次你调用那个路径,你每次都注册【参考方案5】:我也遇到了同样的问题。 我找到了导致问题的原因(对我来说)。我一直在使用Guice 和sitebricks 来构建我的后端服务。
问题
为了使用 Objectify,我必须在我的一个模块中将 ObjectifyFilter
绑定为 Singleton。我正在执行绑定的模块扩展了一个ServletModule
,它通过SitebricksModule
中的Guice 安装,我将我的服务绑定到url。然后将SiteBricksModule
传递给 Guice 的注入器。
我观察到,当我在另一个模块中安装一个模块时,问题仍然存在。
我找到的解决方案
我将两个模块分开并将它们都传递给 Guice 的注入器。或
分离Objectify
的东西,比如在不同的模块中绑定过滤器和指定过滤器模式,然后首先将其传递给 Guice 的注入器。
希望这会有所帮助!
【讨论】:
以上是关于由于缺少 ObjectifyFilter,Objectify 5.1 上下文未启动错误的主要内容,如果未能解决你的问题,请参考以下文章