- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在修改我的项目代码的过程中,我发现我没有机会将 UriInfo 对象插入到资源类中(使用 @Context 注释)不幸的是,我无法更改方法或构造函数签名以检索资源中的 uriinfo 并将其传递给服务类。
是否有任何选项可以将 UriInfo 插入普通类(不是 jax-rs)?也许有一些选项可以说 Jersey 不仅扫描资源类,还扫描自定义类?编辑:
这里是一些代码示例
@Path("path")
public class JerseyResource {
@Get
public Responce executeMethod(@QueryParam Criteria criteria, @QueryParam ObjType type) {
return RestUtils.chooseServiceByType(type).process(criteria);
}
}
RestUtils.chooseServiceByType(type) 可以返回大约 15 个不同的实例。并且只有 1 个实例(即 Type2LogicProcessorServiceImpl)我需要访问 process(criteria) 方法中的 uriInfo 对象
谢谢,迪马
最佳答案
您需要将该类绑定(bind)为 Jersey 的 DI 框架中的服务,HK2 . Jersey 使用 HK2 进行大部分注入(inject),包括 @Context
注入(inject)。由于 @Context
绑定(bind)到 DI,如果您的服务绑定(bind)到 DI,您可以在您的服务中接受 @Context
注入(inject)。
例如,如果你有这个Service
类
public class Service {
@Context
UriInfo uriInfo;
public String getUri() {
return uriInfo.getRequestUri().toASCIIString();
}
}
然后你需要像这样绑定(bind)它
public class Binder extends AbstractBinder {
@Override
protected void configure() {
bind(Service.class).to(Service.class);
}
}
然后向 Jersey 注册 Binder 。在 ResourceConfig
中你可以做
public class AppConfig extends ResourceConfig {
public AppConfig() {
register(new Binder());
}
}
如果你使用的是web.xml,那么就没有办法直接注册binder了。您将需要使用 Feature
并让该功能被发现。您可以在那里注册 Binder 。
@Provider
public class BinderFeature implements Feature {
@Override
public boolean configure(FeatureContext ctx) {
ctx.register(new Binder());
return true;
}
}
然后您可以将Service
注入(inject)到您的资源类中
@Path("uri")
public class UriResource {
@Inject
Service service;
@GET
public String get() {
return service.getUri();
}
}
更多信息:
看看下面的测试。它都可以通过单个测试依赖项运行
<dependency>
<groupId>org.glassfish.jersey.test-framework.providers</groupId>
<artifactId>jersey-test-framework-provider-grizzly2</artifactId>
<version>${jersey2.version}</version>
<scope>test</scope>
</dependency>
我所做的是使用 HK2 Factory
注入(inject)查询参数 ObjType
,并获取 Service
(现在只是一个接口(interface) super 类型)。如果它是需要 UriInfo
的类型,我会用 ServiceLocator
明确地注入(inject)它。工厂和定位器对您来说可能是新概念,所以如果您想了解更多信息,我会浏览上面提供的两个文档链接。
import java.util.logging.Logger;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.glassfish.hk2.api.Factory;
import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.filter.LoggingFilter;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Test;
import static junit.framework.Assert.assertEquals;
public class UriInfoTest extends JerseyTest {
public static interface Service {
String getUri();
}
public static class ServiceOne implements Service {
@Context
UriInfo uriInfo;
@Override
public String getUri() {
return uriInfo.getRequestUri().toASCIIString();
}
}
public static class ServiceTwo implements Service {
@Override
public String getUri() {
return "Blah";
}
}
public static class ObjType {
String param;
public ObjType(String param) {
this.param = param;
}
}
static class RestUtils {
static Service getServiceByType(ObjType type) {
switch (type.param) {
case "one": return new ServiceOne();
case "two": return new ServiceTwo();
default: return new ServiceOne();
}
}
}
public static class ServiceFactory implements Factory<Service> {
@QueryParam("type")
ObjType type;
@Inject
ServiceLocator locator;
@Override
public Service provide() {
Service service = RestUtils.getServiceByType(type);
if (service instanceof ServiceOne) {
locator.inject(service);
}
return service;
}
@Override
public void dispose(Service t) {}
}
public static class Binder extends AbstractBinder {
@Override
protected void configure() {
bindFactory(ServiceFactory.class).to(Service.class);
}
}
@Path("uri")
public static class UriResource {
@Inject
Service service;
@GET
public String get() {
return service.getUri();
}
}
@Override
public ResourceConfig configure() {
return new ResourceConfig(UriResource.class)
.register(new Binder())
.register(new LoggingFilter(Logger.getAnonymousLogger(), true));
}
@Test
public void doit() {
Response response = target("uri").queryParam("type", "one").request().get();
assertEquals(200, response.getStatus());
String message = response.readEntity(String.class);
assertEquals("http://localhost:9998/uri?type=one", message);
response.close();
}
}
关于java - 如何将 UriInfo 对象注入(inject)非资源类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34201468/
在 Windows 世界中,什么是正确的名称。具有导出函数的老式 C++ DLL?不是 COM DLL,也不是 .NET DLL。我们以前通过调用 LoadLibrary() 和 GetProcAdd
目前我正在使用javaEE7,我有一个场景如下。在我的 JSF Web 应用程序中,我有一个事件监听器(不是 JSF 事件),当事件调用时,它会执行某些操作,然后将这些信息更新到我的 Web 应用程序
这不是 AJAX 请求/响应回调问题... 我正在使用 Dojo 1.5 构建网格。我正在尝试 dojo.connect具有功能的扩展/收缩按钮。我的问题是 grid.startup()在创建实际 D
非 Webkit Opera 是 very specific在某些功能中,因此通常通过 JavaScript 检测到 the following way . 但是,Opera Next 几乎是 Goo
我已查看以下链接中给出的所有日志,但未能找到 IP 地址: https://developer.couchbase.com/documentation/server/3.x/admin/Misc/Tr
我有一个命令行程序,它根据一组源文件生成一个我想在我的 Android gradle 构建 (A) 中使用的 jar 文件。这个命令行程序只是将一个 jar 文件存储在磁盘上的一个目录中。 我如何创建
下面的 htaccess 命令将所有非 www 转移到 http www RewriteEngine On RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^
我正在使用自定义链接器脚本将内核镜像分为两部分。第一个是普通代码和数据,第二个是初始化代码和不再需要时将被丢弃的数据。初始化部分也不像内核本身那样在地址空间之间共享,因此如果 fork() 仍然存在(
这个问题在这里已经有了答案: Several unary operators in C and C++ (3 个答案) What is the "-->" operator in C++? (29
假设我有一个类设置如下: class A { public: virtual void foo() { printf("default implementation\n"); } }; c
#include using namespace std; int main(int argc, char *argv[]) { int i=-5; while(~(i)) {
近期,百度搜索引擎变化无常,很多企业站、行业站、门户站、论坛等站点遭到了降权,特别是比比贴分类信息网直接遭到了拔毛,这对于广大站长来说是一种打击,也是各个企业、行业的打击。 至今,很多网站已经恢复
我现在正在使用 IBM TPM v1332 + IBM TSS v1470 并尝试将一些基本关键字/密码存储到 TPM 上的非 volatile 内存中。我找到了两种方法。一种是创建一个密封对象并使用
我的 PHP 脚本中有一个正则表达式,如下所示: /(\b$term|$term\b)(?!([^)/iu 这与 $term 中包含的单词匹配,只要前后有单词边界并且它不在 HTML 标记内即可。 但
我想显示用户名称地址(请参阅 www.ipchicken.com ),但我唯一能找到的是 IP 地址。我尝试了反向查找,但也没有用: IPAddress ip = IPAddress.Parse(th
只有 UI 线程能够显示到屏幕上,还是其他线程也可以这样做? 最佳答案 不,您只能直接从 UI 线程访问 UI,但您可以编码来自其他线程的结果,例如使用 Control.Invoke 或 contro
我正在使用现代 Excel 滚动条(不是旧的 ActiveX 类型,即开发人员 > 插入 > 表单控件 > 滚动条)并且想检测它的值何时更改。我找不到有关此类对象的更改事件的任何信息。您可以在单击时分
当我使用这段代码时 IE 6 确实正确使用了指定的样式表,但所有其他浏览器在应该使用基本上声明的样式表时会忽略这两种样式表,如果您不是 IE,请使用此样式表。 有什么想法吗? 最佳答案 n
我想指定 2 mssql 表之间的关系。 付款类别和付款。 paymentcategory.id 加入 payout.category 列。 在 payout.json 模型中 我指定为外键:id,
我正在尝试制作非 volatile UDF,但似乎不可能。因此,这是我非常简单的test-UDF: Option Explicit Dim i As Integer Sub Main() i = 0
我是一名优秀的程序员,十分优秀!