这是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()
生成的线程内运行Objectify?
编辑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运行时。
答案 0 :(得分:1)
您可以创建一个工作单元(与过滤器完全相同),如下所示:
ObjectifyService.run(() -> {
ofy().load()...etc
});
另请参阅begin()
方法,这几乎是一样的(您可以使用try-with-resources而不是传递闭包)。