【问题标题】:Objectify 5.1 Context Not Started Error due to missing ObjectifyFilter由于缺少 ObjectifyFilter,Objectify 5.1 上下文未启动错误
【发布时间】:2023-03-14 14:04:01
【问题描述】:

使用最新版本的 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;
  • 我已经试过了,但没有运气,它仍然会抛出同样的错误

标签: google-app-engine objectify


【解决方案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】:

        我也遇到了同样的问题。 我找到了导致问题的原因(对我来说)。我一直在使用Guicesitebricks 来构建我的后端服务。

        问题

        为了使用 Objectify,我必须在我的一个模块中将 ObjectifyFilter 绑定为 Singleton。我正在执行绑定的模块扩展了一个ServletModule,它通过SitebricksModule 中的Guice 安装,我将我的服务绑定到url。然后将SiteBricksModule 传递给 Guice 的注入器。

        我观察到,当我在另一个模块中安装一个模块时,问题仍然存在。

        我找到的解决方案

        • 我将两个模块分开并将它们都传递给 Guice 的注入器。

        • 分离 Objectify 的东西,比如在不同的模块中绑定过滤器和指定过滤器模式,然后首先将其传递给 Guice 的注入器。

        希望这会有所帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-05-06
          • 2016-03-05
          • 2013-11-08
          • 1970-01-01
          • 2020-04-19
          • 2014-03-14
          • 2018-10-24
          • 2015-03-19
          相关资源
          最近更新 更多