- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想向 Jersey 资源注入(inject)一个实现 AutoClosable 的对象,并让框架在请求结束时自动关闭它。
基本上,这是一个数据库连接提供程序,打开的连接应在请求结束时关闭。
使用 @inject
注释时,对象不会关闭。
这可能吗?如何实现?
最佳答案
您可以使用CloseableService
The service may be used within the scope of a request to add instances of
Closeable
that are to be closed when the request goes out of scope, more specifically after the request has been processed and the response has been returned.
您可以将此服务注入(inject)到 Factory
中,您可以在其中创建您的提供程序。只需将提供程序添加到 Factory
内的 CloseableService
中,它将在请求结束时关闭。
public class ConnectionProviderFactory implements Factory<ConnectionProvider> {
@Inject
private CloseableService closeableService;
@Override
public ConnectionProvider provider() {
ConnectionProvider provider = new ConnectionProvider();
closeableService.add(provider);
return provider;
}
@Override
public void dispose(ConnectionProvider provider) {
}
}
然后只需在你的 Binder 中注册工厂即可
bindFactory(ConnectionProviderFactory.class)
.to(ConnectionProvider.class)
.in(RequestScoped.class);
请注意,Factory
类有一个 dispose
方法。我不能百分百确定它是如何工作的细节,因为我有过有时它被调用,有时不被调用的经验。我发现 CloseableService
更可靠。也许有一天我会四处挖掘,尝试为自己解开 dispose
方法的谜团。
不太确定您在做什么不同的事情,但下面是使用 Jersey Test Framework 的完整测试。像任何其他 JUnit 测试一样运行它。唯一的区别是我使用 Closeable
来代替 AutoCloseable
import java.io.Closeable;
import java.util.logging.Logger;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;
import org.glassfish.hk2.api.Factory;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.filter.LoggingFilter;
import org.glassfish.jersey.process.internal.RequestScoped;
import org.glassfish.jersey.server.CloseableService;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class InjectCloseableTest extends JerseyTest {
public static final String CONNECTION_MSG = "Connection";
public static class ConnectionProvider implements Closeable {
private static final Logger LOGGER
= Logger.getLogger(ConnectionProvider.class.getName());
public String getConnection() {
return CONNECTION_MSG;
}
@Override
public void close() {
LOGGER.info("---- Closing Connection ----");
}
}
@Path("connection")
public static class ConnectionResource {
@Inject
ConnectionProvider connectionProvider;
@GET
public String get() {
return connectionProvider.getConnection();
}
}
public static class ConnectionProviderFactory implements Factory<ConnectionProvider> {
@Inject
CloseableService closeableService;
@Override
public ConnectionProvider provide() {
ConnectionProvider provider = new ConnectionProvider();
closeableService.add(provider);
return provider;
}
@Override
public void dispose(ConnectionProvider t) {}
}
@Override
public ResourceConfig configure() {
return new ResourceConfig(ConnectionResource.class)
.register(new LoggingFilter(Logger.getAnonymousLogger(), true))
.register(new AbstractBinder() {
@Override
protected void configure() {
bindFactory(ConnectionProviderFactory.class)
.to(ConnectionProvider.class)
.in(RequestScoped.class);
}
});
}
@Test
public void doit() {
Response response = target("connection").request().get();
assertEquals(200, response.getStatus());
assertEquals(CONNECTION_MSG, response.readEntity(String.class));
response.close();
}
}
这是运行它所需的唯一依赖项。
<dependency>
<groupId>org.glassfish.jersey.test-framework.providers</groupId>
<artifactId>jersey-test-framework-provider-grizzly2</artifactId>
<version>${jersey2.version}</version>
<scope>test</scope>
</dependency>
关于java - 使用 Jersey CDI 自动关闭数据库连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33914394/
我已阅读 Jersey documentation ,并表示 Jersey 在读取实体后自动关闭连接(例如 response.readEntity(SomeObject.class)) 但是当抛出异常
Jersey vs Jersey (Standalone) vs Jersey with Grizzly vs Jersey with Tomcat - for REST services 有什么区别
如何通过 guice 使用非 Jersey 资源和 Jersey 资源? 我希望“/”由普通 servlet 处理。但我希望 Jersey 处理“/users”。 假设我有一个带@Path("/use
我正在尝试使用 Maven、Apache Tomcat 7.0、Eclipse IDE 创建一个基本的 RESTful 应用程序。我在 google 提供的一些示例代码中遇到了 jersey-serv
我已经从 Jersey 1.7 升级到 2.16,但 Jersey 似乎无法找到我的资源(请参阅下面的堆栈)。任何想法发生了什么?我尝试在扩展 ResourceConfig 的自定义应用程序类中初始化
我正在使用 com.yammer.dropwizard.config.Environment addProvider 方法在 Jersey 中注册提供程序。我也有一个自定义提供程序,它执行类似于 Dr
在 Jersey 1.x 中,您可以使用 ContainerRequest.getFormParameters()对表单数据进行请求过滤,但我在 Jersey 2.x 中看不到明显的等价物。我已经实现
我正在使用Jersey的集成Jackson处理将传入的JSON转换为POJO,例如: @POST @Consumes(MediaType.APPLICATION_JSON) public Respon
我正在尝试以编程方式创建 Jersey 资源(没有注释)。我有一个将 Name 和 id 作为输入参数的方法 raiseAlarm。我想从 JSON 输入中获取名称,并且我希望 id 来自路径参数。代
Dropwizard official documentation Jersey 客户端不可测试,有人有 dropwizard Jersey 客户端样本吗? 最佳答案 我发现在 Dropwizard
我一直在寻找解决这个问题的方法,但没有成功。我发现的最新帖子可以追溯到 2010 年。我正在使用带有嵌入式 grizzly 2.2.1 的 Jersey 1.12。 如果我理解正确,除非我将 Jers
我想开发一个 Web API,它将生成和使用 JSON 和 XML 数据。 我已经使用JAXB来支持XML,并且工作正常。现在我想添加 JSON 类型。我研究了不同的教程,所有教程都使用不同的依赖项,
如此处所述:http://wikis.sun.com/display/Jersey/WADL 我在 Tomcat 6 中使用 Jersey 1.4。 我已经尝试了所有可能的带有“/applicatio
我是jax-rs的新手,并且已经用jersey和glassfish构建了Web服务。 我需要的是一种方法,服务启动后即被称为。在这种方法中,我想加载自定义配置文件,设置一些属性,编写日志等等。 我尝试
当客户端请求 Not Acceptable MIME 类型时,如何防止 Jersey 在客户端发送 HTML 页面?我想使用 ExceptionMapper,但我不确定要捕获什么异常,或者这是否是处理
我试图在它的 JSON 被解码后拦截一个资源调用。通过阅读一些论坛和帖子,我发现我可以通过实现 来做到这一点。 org.glassfish.jersey.server.spi.internal.Res
我的 webapp 包含一个库,其中包含一个用 @javax.ws.rs.ext.Provider 注释的类。 .如果存在此类,我的 web 应用程序(在 EAR 中部署为 WAR)将无法启动并显示以
我想自定义404响应,即服务器(不是我)在找不到请求的资源时抛出(或自己抛出一个自定义的WebApplicationException,如果可以测试一个应用程序中是否存在请求的资源)?资源列表存储在某
我有一个受 Shibboleth(SSO 实现)保护的 Jersey API。 Shibboleth 将登录用户的 ID 放入请求属性中。在后端,我使用 Shiro 进行授权。 Shiro 希望了解登
我目前正在使用 Jersey 返回 JSON。我该如何返回 JSONP?例如我当前的RESTful方法是: @GET @Produces(MediaType.APPLICATION_JSON) pub
我是一名优秀的程序员,十分优秀!