Objectify 在 createThreadForCurrentRequest() 中不起作用

Objectify doesn't work inside createThreadForCurrentRequest()

这是 an answer here 的后续问题。

我在 servlet 中有以下代码:

createThreadForCurrentRequest(() => {
    // do stuff
}).start();

但是当我在本地运行它时,我收到了这个异常:

Exception in thread "Thread-17" 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.

我哪里做错了?

换句话说: 我如何 运行 在 createThreadForCurrentRequest() 生成的线程中对象化?

编辑 1: 根据要求,这里是 web.xml:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.0"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         metadata-complete="true">

    <absolute-ordering/>

    <!-- Register Objectify model -->
    <listener>
        <listener-class>foo.ObjectifyListener</listener-class>
    </listener>

    <filter>
        <filter-name>objectify</filter-name>
        <filter-class>com.googlecode.objectify.ObjectifyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>objectify</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <servlet>
        <servlet-name>bar</servlet-name>
        <servlet-class>foo.BarServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>bar</servlet-name>
        <url-pattern>/foo/bar/</url-pattern>
    </servlet-mapping>

</web-app>

编辑 2:

我使用新的(目前处于测试阶段)Java 8 运行时间。

您可以像这样创建工作单元(与过滤器的方式完全相同):

ObjectifyService.run(() -> {
    ofy().load()...etc
});

另请参阅 begin() 方法,这几乎是一回事(您可以使用 try-with-resources 而不是传递闭包)。