【问题标题】:Objectify context not started / ObjectifyFilter missing未启动 Objectify 上下文/缺少 ObjectifyFilter
【发布时间】:2015-12-27 00:00:03
【问题描述】:

App Engine (突然)告诉我我的 Objectify 设置不正确。它以前工作过,我确实在我的 web.xml 中有 Objectify 过滤器。

这是我的日志中的完整堆栈跟踪:

javax.servlet.ServletContext log: unavailable
java.lang.IllegalStateException: You have not started an Objectify context.
                                 You are probably missing the ObjectifyFilter.
                                 If you are not running in the context of an http request, see the ObjectifyService.run() method.
    at com.googlecode.objectify.ObjectifyService.ofy(ObjectifyService.java:44)
    at com.mydomain.gae.defaultmodule.MyObject.loadEverything(MyObject.java:21)
    at com.mydomain.gae.defaultmodule.MyServlet.init(MyServlet.java:40)
    at javax.servlet.GenericServlet.init(GenericServlet.java:212)
    at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:440)
    at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:263)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:206)
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:179)
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:136)
    at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:469)
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:437)
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:444)
    at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:256)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:308)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:300)
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:441)
    at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:235)
    at java.lang.Thread.run(Thread.java:745)

这是我的 web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <listener>
        <listener-class>
            com.mydomain.gae.defaultmodule.Initializer
        </listener-class>
    </listener>

    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>com.mydomain.gae.defaultmodule.MyServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

    <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>

</web-app>

...然后是代码:

public class Initializer implements ServletContextListener {

    @Override
    public void contextInitialized(@Nonnull final ServletContextEvent SCE) {
        ObjectifyFactory oFactory = ObjectifyService.factory();
        oFactory.register(MyEntity.class);
        oFactory.register(MyOtherEntity.class);
        oFactory.begin();
    }
}

public final class MyServlet extends HttpServlet {

    private MyObject = myObj;

    @Override
    public void init() throws ServletException {
        myObj = new MyObject();
        myObj.loadEverything();
    }
}

public class MyObject extends MyOtherObject {

    public void loadEverything() {
        for (MyEntity me : ofy().load().type(MyEntity.class).list()) {
            // Do very important things.
        }
    }
}

IllegalStateException 一到达ofy().load().type(MyEntity.class).list() 就会被抛出。该代码以前有效。我不知道为什么这突然在我面前爆炸了,因为这里共享的代码在爆炸之前都没有改变。

如果有人有任何想法可以让我朝着正确的方向前进,我会 100% 有兴趣听到它们。

【问题讨论】:

    标签: java google-app-engine google-cloud-datastore objectify


    【解决方案1】:

    过滤器适用于请求。您的 servlet init 方法没有在请求的上下文中被调用,因此 ObjectifyFilter 没有运行 - 请注意它不在您的堆栈跟踪中。

    去掉contextInitialized()中的oFactory.begin(),那不是正确使用那个方法。

    如果您想在您的 servlet init() 中使用 Objectify,请在 ObjectifyService.run() 中运行您的代码:

    ObjectifyService.run(new VoidWork() {
        public void vrun() {
            myObj = new MyObject();
            myObj.loadEverything();
        }
    });
    

    这将以与过滤器相同的方式设置和拆除 Objectify 上下文。

    【讨论】:

    • factory().run() 似乎不存在。我猜你的意思是ObjectifyService.run()
    • ObjectifyService.run() 放入您的代码中效果很好,坚持。谢谢一百万,先生。真的救了我的培根!我从来没有真正想到init(),与 Servlet 中的所有其他方法不同,它实际上并不在 HTTP 请求的上下文中。一旦我真正想到它,就非常明显......但在今天之前我没有。再次感谢一百万,Stick。
    • 哎呀呀!我更新了答案。很高兴你能恢复运行:)
    【解决方案2】:

    对我来说,问题出在 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>
    

    但是,我在 ServletContextListener 中使用了 ObjectifyFactory;像这样:

    ObjectifyService.init(new ObjectifyFactory(
        DatastoreOptions.newBuilder()
            .setProjectId("PROJECT_ID")
            .build()
            .getService()
        ));
    

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 2020-04-19
      • 2015-02-27
      • 2023-03-24
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      • 2017-10-03
      • 2013-12-02
      相关资源
      最近更新 更多