由于缺少 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 上下文未启动错误的主要内容,如果未能解决你的问题,请参考以下文章

由于缺少依赖项,MSBuild 清理操作失败

Visual Studio 由于缺少调试目标

由于缺少位置权限,应用程序在启动时崩溃

由于缺少对象,DACPAC 无法部署

由于缺少 KIF 类,项目无法构建

“场景由于缺少入口点而无法访问并且没有...” - 解决此警告